2012. 8. 13. 16:59

#include<iostream>

using namespace std;


//주제 10 싱글톤 디자인 기법

//1. 개념 : 오직 한개만을 만들수 있게 한 디자인

//오직 한개의 객체가 static 메모리에 있다. meyer 의 싱글톤이라고 부름.

/*

class Cursor

{

private:

Cursor(){} //즉 객체를 한개도 만들수 없다!


Cursor(const Cursor &); //복사 생성자 금지


public:

static Cursor & getInstance(){

static Cursor instance;

return instance;

}

};


int main(){

Cursor &c1 = Cursor::getInstance();


Cursor &c2 = Cursor::getInstance();


//Cursor c3= c1;//하지만 복사 생성자가 가능하다 


cout<< &c1 << endl;


}

*/


/*

///힙에서 만드는 싱글 톤  - 안드로이드 버전 

//내가 알고있던 싱글톤

class Cursor

{

private:

Cursor(){} //즉 객체를 한개도 만들수 없다!


Cursor(const Cursor &); //복사 생성자 금지

static Cursor * pInstance ; 

public:

static Cursor & getInstance(){

if(pInstance==0){

pInstance = new Cursor;

}

return *pInstance;

}

};

Cursor * Cursor::pInstance=0;


int main(){

Cursor &c1 = Cursor::getInstance();


Cursor &c2 = Cursor::getInstance();


//Cursor c3= c1;//하지만 복사 생성자가 가능하다 


cout<< &c1 << endl;


}*/

/*

/////////////////////////////////////////

// 싱글톤 여러개를 호출시 메크로로 만들기 

// 에러남 -_- 젠장..

/////////////////////////////////////////

#define DECLARE_SINGLETON(classname) private : classname(){ \

classname(const classname&); \

static classname *pInstance;\

public :\

static classname & getInstance();

#define IMPLEMENT_SINGLETON(classname)\

classname  *classname::pInstance =0;\

classname & classname::getInstance()\

{\

if(pInstance == 0)pInstance = new classname;\

return *pInstance;}



class Keyboard

{

DECLARE_SINGLETON(keyboard);

};

IMPLEMENT_SINGLETON(keyboard);


class Cursor

{

private:

Cursor(){} //즉 객체를 한개도 만들수 없다!


Cursor(const Cursor &); //복사 생성자 금지

static Cursor * pInstance ; 

public:

static Cursor & getInstance(){

if(pInstance==0){

pInstance = new Cursor;

}

return *pInstance;

}

};

Cursor * Cursor::pInstance=0;


int main(){

Cursor &c1 = Cursor::getInstance();


Cursor &c2 = Cursor::getInstance();


//Cursor c3= c1;//하지만 복사 생성자가 가능하다 


cout<< &c1 << endl;


}*/


//안드로이드 싱글톤 사용하기 

template <typename TYPE> class Singleton

{

protected:

Singleton(){} //즉 객체를 한개도 만들수 없다!

private:

Singleton(const Singleton &); //복사 생성자 금지

static TYPE * pInstance ; 

public:

static TYPE& getInstance(){

if(pInstance==0){

pInstance = new TYPE;

}

return *pInstance;

}

};

template<typename TYPE> TYPE * Singleton::pInstance=0;


class keyboard : public Singleton<keyboard>{  //mix in template !!


}



int main(){

keyboard & k = keyboard::getInstance();


}


=========================================== MIX IN template method ====================================

#include<iostream>

using namespace std;


// 문제점! 가상함수의 메모리 낭비가 크다!

/*

class Window{


public : 

void MessageLoop(){


int msg = 1;

switch(msg){

case 1: MouseMove();break; //this->MouseMove();

case 2: KeyDown(); break;

}

}

virtual void MouseMove(){

}

virtual void KeyDown(){}



};

//======================================================

class MyWindow : public Window

{

public :

void MouseMove(){ cout << "ouseMove"<<endl;}


}

int main(){


MyWindow w;

w.MessageLoop();

}

*/

////////////////////////////////////////////////////////////////

//virtual 없이 해결하기  부모는 자식의 이름을 알수는 없지만 템플릿을 사용하면 알수 있따.

///////////////////////////////////////////////////////////////


template<typename T> class Window{


public : 

void MessageLoop(){


int msg = 1;

switch(msg){

case 1: static_cast<T*>(this)->MouseMove();break; //this->MouseMove();

case 2: static_cast<T*>(this)->KeyDown(); break;

}

}

void MouseMove(){

}

void KeyDown(){}



};

//======================================================

class MyWindow : public Window<MyWindow>

{

public :

void MouseMove(){ cout << "ouseMove"<<endl;}


}

int main(){


MyWindow w;

w.MessageLoop();

}




Posted by k1rha