언제부터인가 패턴이라는 녀석들을 접하게 되면서
최근에는 Singleton 과 Factory 패턴은 자주 사용하게 된다.

Singleton 은 보통 아래와 같이 구현된다.
함수 내 static 객체를 사용한 전형적인 Singleton 패턴 ( Scott Meyers )
[CODE]
class CSingleton
{
private:
  CSingleton() {}
public:
  ~CSingleton() {}

  static CSingleton & GetInstance(void);
};
CSingleton & CSingleton::GetInstance()
{   static CSingleton s_Instance;   return s_Instance; }
[/CODE]
위와 같은 형식으로 매니저 계열의 인스턴스가 하나만 존재 하는(해야하는) 클래스들을
정의하고 사용했다.
하지만 이 방식에는 문제점이 일어날 가능성이 농후하다.
객체의 사용시점에 자동으로 생성되어 편리하긴 하지만 소멸의 시점이 명시적이지 않기 때문에 (static 객체의 경우 소멸의 시점이 임의로 정의된다.)
다른 객체와 상호 참조 또는 해당 단일체 객체를 참조하는 객체의 파괴 시점에
단일체 객체가 이미 소멸되어 버린경우 Access violation 이 생겨나 graceful 한 종료가 이루어 질 수 없는 것이다.
특히나 종료시에 일부 데이터를 저장하는 서버프로그래밍의 경우에는 문제가 아닐 수 없다.
이는 동적으로 객체의 생성과 해제를 명시적으로 제시하여 이러한 오동작을 예방(?)할 수 있다.

아래는 상속을 통해 좀 더 편리하게 사용할수 있는 Singleton Template
[CODE]template < class T >
class CSingleton
{
  static T * m_spSingleton;
public:
  CSingleton()
  {
    assert(!m_spSingleton);
    int iOffset = (int)(T*)1 - (int)(CSingleton <T>*)(T*)1;
    m_spSingleton = (T*)((int)this + iOffset);
  }
  ~CSingleton()
  {
    assert(m_spSingleton);
    m_spSingleton = 0;
  }

public:
  static T * GetInstancePtr(void)
  {  return (m_spSingleton);  }
  static T & GetInstance(void)
  {  assert(m_spSingleton);  return (*ms_pSingleton);  }
};
template < typename T > T * CSingleton <T>::m_spSingleton = 0;
[/CODE]

,