Dplex

Dplex.egloos.com

포토로그


시계

통계 위젯 (화이트)

23
43
108272


Singleton vs Monostate C/C++


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
using namespace std;
 
class Single{
public:
    bool isEqual(Single *other)
    {
        if(this == other)
            return true;
        return false;
    }
    bool isMemberEqual(Single *other)
    {
        if(this->instance == other->instance)
            return true;
        return false;
    }
    static Single* getInstance();
private:
    static Single* instance;
    Single(){}
};
 
Single* Single::instance = NULL;
Single* Single::getInstance(){
    if(instance==NULL)
        instance = new Single();
    return instance;
}
 
class Monostate{
public:
    Monostate(){}
    bool isEqual(Monostate *other)
    {
        if(this == other)
            return true;
        return false;
    }
    bool isMemberEqual(Monostate *other)
    {
        if(this->instance == other->instance)
            return true;
        return false;
    }
private:
    static Monostate* instance;
};
Monostate* Monostate::instance = new Monostate();                                         
 
int main()
{
    Single *s1 = Single::getInstance();
    Single *s2 = Single::getInstance();
    if(s1->isEqual(s2))
        cout << "Same" << endl;
    else
        cout << "Different" << endl;
    if(s1->isMemberEqual(s2))
        cout << "RealSame" << endl;
    Monostate* m1 = new Monostate();
    Monostate* m2 = new Monostate();
    if(m1->isEqual(m2))
        cout << "Same" << endl;
    else
        cout << "Different" << endl;
    if(m1->isMemberEqual(m2))
        cout << "RealSame" << endl;
}

GoF 디자인 패턴중에 가장 기초적인 개념으로 싱글톤패턴이 소개됩니다. GoF라는 4명의 패턴대가(?)들이 정립한 23개의 패턴들중 하나인데, 패턴에 익숙하지 않은 아직 학생의 입장이라던가 이제 막 시작하는 프로그래머들이 가장 쉽게 이해할수 있는 싱글톤 패턴입니다...

하지만.. GoF패턴이 많이 발전하였다고는 하지만 이미 충분히 객체지향의 늪에 빠져있는 요즈음에는 글쎄요.. 객체지향으로만 코딩하는 프로그래머들에게 갑자기 싱글톤으로 바꿔!!!라던지 싱글톤으로 처리해!!! 라고 한다면.. 혹은 싱글톤으로 설계를 바꾸자라고 한다면.. 전 아마 싫어요!! 라고 단호하게 거절할거 같습니다..

싱글톤이 사실 전역으로 무언가를 쓰고싶거나 객체가 하나만 있어야 될때를 염두해두고 나온 패턴이라서.. 
전역변수 vs 싱글톤 글타래도 엄청많고, SingletonsAreEvil 이라는 유명한 투고도 있습니다..

싱글톤을 처음에 배우게되면 제 느낌인지 성향인지는 모르겠지만 처음배운 패턴이 전역객체를 하나만쓰는 패턴이라니.. 
어랏;; 객체지향언어관점에서 봤을때는 되게 어불성설 느낌이 강했습니다.. 막 Java, C++, C#을 하다가 갑자기 C처럼 코딩하라고 압박을 주는 느낌을 받았더랬죠..

싱글톤 패턴을 생각하고 코딩을 하게되면 자연스럽게 객체지향관점에서 전역변수 잔뜩있는 절차지향관점으로 생각이 바뀌는 듯합니다.. 저만 그럴수도 잇구요... 

무튼 그래서 Singletton과 Monostate에 대해 짧게 비교한 코드를 넣었습니다..

Monostate는 Constructor를 public으로 하자 그래서 객체 마음대로 만들게 놔두자.. 온전히 static 키워드 만으로 진짜 필요한 객체는 하나만 만들자 혹은 공유되어야할 객체는 하나만 만들자 라는 느낌의 Singleton과 비슷하지만 조금 다른 느낌입니다..

Monostate도 일종의 싱글톤이라고 생각할수도 있지만.. 객체 자체를 하나만 만드는게 아닌 객체내의 static 멤버변수를 하나만 만드는 일종의 tricky한 방법입니다.

덧글

댓글 입력 영역