이 문서는 2011년 11월 29일날 생성되었습니다.
이 문서는 2011년 12월 08일날 수정되었습니다.




일반적으로 싱글톤 패턴(Singleton Pattern)을 구현하는 방법은 여러가지가 알려져 있습니다.
그 중 상속과 template을 사용해서 구현하는 방법을 소개하겠습니다.



RunTimeSingleton.hpp 
#include <cassert>

template < typename T >
class RunTimeSingleton
{
public:
    static T* m_pInstance;

public:
    RunTimeSingleton()
    {
        assert( NULL == RunTimeSingleton<T>::m_pInstance);
        RunTimeSingleton<T>::m_pInstance= (T*)this;
    }

    RunTimeSingleton(RunTimeSingleton &rhs)
    {
        assert( NULL == RunTimeSingleton<T>::m_pInstance);
        RunTimeSingleton<T>::m_pInstance= (T*)this;
    }

    ~RunTimeSingleton()
    {
        RunTimeSingleton<T>::m_pInstance= NULL;
    }

    static T* GetInstance()
    {
        return m_pInstance;
    }
};

/*static*/ template < typename T > T* RunTimeSingleton<T>::m_pInstance= NULL;


이 코드의 장점:
* 상속을 사용함으로써, 기존 방식을 보다 사용하기 쉽도록 단순화 하였습니다.
* 사실, 기존방식으로 구현한 싱글톤은 상속을 하게되면 하위 Class들의 수정도 불가피 하였죠.
* 그리고 기존의 class를 있는 그대로 사용하면 됩니다. 

이 코드의 단점:
* assert로 프로그램을 종료시키므로, 실행시간에만 에러를 검출 할 수 있는 치명적인 단점이 존재합니다.
* 하지만 인스턴스를 Stack에 생성한다면 실행시키자 마자 종료되므로, 되도록이면 stack에 생성해야 합니다.

구현상 특징:
* 싱글톤을 템플릿을 사용하여 구현하였습니다.
* 인스턴스가 생성되면 global한 T* 타입의 포인터에 this를 저장하는 것으로 인스턴스의 생성을 체크합니다.
* 다시말해, 한가지 타입당 하나의 인스턴스만 만들어집니다. 멋지죠?


+ Recent posts