Singleton Pattern

어제 ‘Programming game AI by example’을 읽던 중 Singleton이란 개념을 처음(아마 한 8년 전 쯤에는 알았을지도.) 접했다.

If singletons are a new concept to you, and you decide to search the internet for further information, you will discover they fuel many a good argument about the design of object-oriented software. Oh yes, programmers love to argue this stuff, nothing stokes a dispute better than the discussion of global variables or object that masquerade as globals, such as singltons. My own stance on the matter is to use them wherever I think they provide a convenience and, in my opinion, do not compromise the design. I recommend you read the arguments for an against though, and come to your own conclusions. A good staring place is here: http://c2.com/cgi/wiki?SingletonPattern

– p59, Programming game AI by design

Head first design patterns’에서는 Singleton을 이렇게 정의하고 있다.

The Singleton Pattern ensures a class has only one instance, and provides a global point of access to it.

– p177 Head first design patterns

다시 ‘Programming game AI by example’로 돌아오면

There are many ways of implementing a singleton. I prefer to use a static method, Instance. that returns a pointer to a static instance of the class. Here’s an example:

/* ------------------ MyClass.h -------------------- */
#ifndef MY_SINGLETON
#define MY_SINGLETON
class MyClass
{
private:

  // member data
  int m_iNum;

  //constructor is private
  MyClass(){}

  //copy ctor and assignment should be private
  MyClass(const MyClass &);
  MyClass& operator=(const MyClass &);

public:

  //strictly speaking, the destructor of a singleton should be private but some
  //compilers have problems with this so I’ve left them as public in all the
  //examples in this book
  ~MyClass();

  //methods
  int GetVal()const{return m_iNum;}
  static MyClass* Instance();
};
#endif

/* -------------------- MyClass.cpp ------------------- */
//this must reside in the cpp file; otherwise, an instance will be created
//for every file in which the header is included
MyClass* MyClass::Instance()
{
  static MyClass instance;
  return &instance;
}

– p59, Programming Game AI by example.

static 키워드를 사용하는 간단한 방법이다. 단점이라면 한번 MyClass::Instance()로 인스턴스를 만들면 그걸 메모리로 부터 제거할 수 있는 방법이 없어 보인다.

Advertisements
This entry was posted in C++ and tagged , , . Bookmark the permalink.

3 Responses to Singleton Pattern

  1. cwjturnleft says:

    예, 아닌게 아니라 singleton은 요즘은 anti-pattern 으로 간주됩니다.
    특히 요즘처럼 TDD 중시하는 분위기에서 코드에서 직접 reference 되는 singleton은 테스트 코드 작성하는데 쥐약이거든요. Global 하게 존재하는 객체가 있더라도 singleton pattern 으로 접근하는게 아니라 사용자 클래스 생성자를 통해 삽입하는 방식이 더 선호가 됩니다.

    구경 와 본 김에 댓글 한 번 달아봤어요 ^^;

    Like

    • Seyoung says:

      왜 테스트코드를 작성하기가 어려운 걸 까요?

      Like

      • cwjturnleft says:

        테스트를 제대로 하려면 외부 dependency 를 제거하거나 fake object 로 대체를 해야 하는데, singletone 을 쓰면 singletone 객체에 대한 참조가 코드에 박혀 버리거든요. 게다가 singleton 을 참조하는 코드를 다른 곳에서 재사용을 하려면 singleton도 같이 가져가거나(그럴 가능성은 희박하죠), 코드를 수정해야 하거든요. 결국 dependency inversion rule과 공존할 수 없는 패턴인데, 갈수록 사용 편의성보다는 DI이 더 중요하다는데 공감대가 모아지고 있어서 singleton 은 쓰지 말자는 쪽으로 이야기를 많이 합니다.

        Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s