본문 바로가기

C++ in Windows/Design Patterns

Singleton을 Template로 만들기

디자인 패턴을 공부하면서 Singleton을 가장 먼저 쓸수 있게 되었다.
그러다가 고민.. 이걸 template로 만들어서 찍어내는건 어떨까?? 하면서 만들게 된게 바로 이것.

Singleton.h
#ifndef _Singleton_H_
#define _Singleton_H_

// Design Pattern : Singleton Class
template <class Single>

class CSingleton
{
private:
	// Static member variable
	 static Single* Instance;
protected:
	CSingleton();
	~CSingleton();
public:
	// Instance Construct
	static Single* GetInstance()
	{
		// Notting Instance Value
		if ( Instance == 0 )
		{	
			Instance = new Single;
		}
		
		return Instance;
	}

	// Instance Release
	static void Release()
	{
		if ( Instance != 0 )
		{
			delete Instance;
			Instance = 0;
		}
	}
};

template <class Single>
Single* CSingleton<Single>::Instance = 0;

template <class Single>
CSingleton<Single>::CSingleton()
{
}

template <class Single>
CSingleton<Single>::~CSingleton()
{
}

#endif
위의 템플레이트를 사용하는 예제는 아래를 클릭하라.

tempClass.h
#ifndef _tempClass_h_
#define _tempClass_h_

#include "Singleton.h"

class tempClass: public CSingleton <tempclass>
{
public:
	tempClass(void);
	~tempClass(void);
public:
    void Hello(void);
 
};

static tempClass* pTemp = tempClass::GetInstance();

#endif

tempClass.cpp
#include "tempClass.h"

tempClass::tempClass(void)
{
}

tempClass::~tempClass(void)
{
}

void tempClass::Hello(void)
{
    printf("Hello World\n");
}

이제 이 tempClass를 사용할때는 아래처럼 사용한다.
#include "tempClass.h"

void main(void)
{
    pTemp->Hello();
}
tempClass의 헤더만 추가하면 pTemp 매크로를 이용해 어디에서든지 접근이 가능하다. 물론 쓰레드 환경에서는 좀더 개선해야할 필요성이 있다.