#include <iostream>
using namespace std;
class Mutex {
public:
void lock() {
cout << "Mutex::lock " << endl;
}
void unlock() {
cout << "Mutex::unlock " << endl;
}
};
template<typename T> class ScopeLock {
T& obj;
public:
ScopeLock(T* o) : obj(*o) { obj.lock(); }
ScopeLock(T& o) : obj(o) { obj.lock(); }
~ScopeLock() { obj.unlock(); }
};
// 템플릿 상속을 사용하면 탬플릿의 인자로 유저의 심볼을 인자로 받을 수 있으므로
// 먼 미래의 사용자가 사용하게 될 심벌의 처리할 수 있다.
template<typename T> class SingleTon {
private:
SingleTon(const SingleTon&);
SingleTon& operator=(const SingleTon);
protected:
// 자식 클래스만 객체를 생성할 수 있도록 protected 생성자 추가
SingleTon() {}
static T* sInstance;
static Mutex mutex;
public:
static T& getInstance() {
ScopeLock<Mutex> sl(mutex);
if(sInstance==0)
sInstance=new T;
return *sInstance;
}
};
template<typename T> T* SingleTon<T>::sInstance = 0;
template<typename T> Mutex SingleTon<T>::mutex;
class Cursor : public SingleTon<Cursor> {};
Cursor* Cursor::sInstance;
Mutex Cursor::mutex;
int main(void) {
Cursor& c1 = Cursor::getInstance();
Cursor& c2 = Cursor::getInstance();
cout << "&c1 = " << &c1 << endl;
cout << "&c2 = " << &c2 << endl;
return 0;
}
'Developer > Design Patterns' 카테고리의 다른 글
Factory Pattern을 이용한 도형 만들기 (0) | 2014.05.17 |
---|---|
컴포지트 패턴을 이용한 메뉴구성 (0) | 2014.05.17 |
싱글톤 패턴 & RAII (0) | 2014.05.17 |
Mutex를 이용한 싱글톤패턴 동기화 (0) | 2014.05.17 |
메크로를 이용한 SingleTon 자동생성 (1) | 2014.05.17 |