#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();
}
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]11. 함수포인터로 구현해본 안드로이드 Thread 예제제 (0) | 2012.08.13 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의]10. 멤버함수 호출의 정리 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의]8. 상수함수 이야기 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의]7. 생성자 이야기 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의]6. 객체 지향의 탄생 배경을 STACK 소스로 알아보기 (0) | 2012.08.13 |