您的位置:首页 > 编程语言 > C语言/C++

Singleton模式的C++实现研究

2009-04-28 10:49 561 查看
[附件一:演示程序代码清单]
/*//////////////////////////////////////////////////////////////////
作者:张友邦
时间:2002年10月9日
描述:实现Singleton
/*//////////////////////////////////////////////////////////////////

#include <iostream.h>
#include <tchar.h>

////////////////////////////////////////////////////////////////////
//第一种实现(使用模板函数)
class MySingleton1
{
private:
MySingleton1(){ cout << _T("Construct MySingleton1") << endl; }
MySingleton1 & operator =(const MySingleton1&){}
template <typename T>
friend T& GetInstanceRef();

public:
~MySingleton1(){ cout << _T("Destroy MySingleton1") << endl; }

public:
void DoSomething(){ cout << _T("Do something here in MySingleton1") << endl; }
};
template <typename T>
T& GetInstanceRef()
{
static T _instance;
return _instance;
}
template <typename T>
T* GetInstancePtr()
{
return &GetInstanceRef<T>();
}
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
//第二种实现(使用模板类)
template <typename T>
class SingletonWraper
{
public:
static T& GetInstanceRef()
{
static T _instance;
return _instance;
}
static const T& GetInstanceConst()
{
return GetInstanceRef();
}
static T* GetInstancePtr()
{
return &GetInstanceRef();
}
};
#define DEFINE_SINGLETON(ClassName); /
public: /
friend class SingletonWraper<ClassName>; /
typedef class SingletonWraper<ClassName> SingletonWraper; /
typedef SingletonWraper SingletonInterface; /
private: /
const ClassName& operator=(const ClassName&) /
{ /
return SingletonInterface::GetInstanceRef(); /
} /
ClassName(const ClassName&); /
private: /
static void operator delete(void *p, size_t n) /
{ /
throw -1; /
}//End of define DECLARE_SINGLETON(ClassName);

class MySingleton2
{
DEFINE_SINGLETON(MySingleton2);
private:
MySingleton2(){ cout << _T("Construct MySingleton2") << endl; }

public:
~MySingleton2(){ cout << _T("Destroy MySingleton2") << endl; }
public:
void DoSomething(){ cout << _T("Do something here in MySingleton2") << " " << endl; }
};
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
//第三种实现(由类自身实现,自动销毁对象,相比之下,它更简单)
#define DECLARE_SINGLETON(ClassName); /
public: /
static ClassName& GetInstanceRef() /
{ /
static ClassName _instance; /
return _instance; /
} /
static const ClassName& GetInstanceConst() /
{ /
return GetInstanceRef(); /
} /
static ClassName* GetInstancePtr() /
{ /
return &GetInstanceRef(); /
} /
const ClassName& operator=(const ClassName&) /
{ /
return GetInstanceRef(); /
} /
private: /
ClassName(const ClassName&); /
static void operator delete(void *p, size_t n) /
{ /
throw -1; /
}//End of define DECLARE_SINGLETON(ClassName);

class MySingleton3
{
DECLARE_SINGLETON(MySingleton3);

private:
MySingleton3(){ cout << _T("Construct MySingleton3") << endl; ID = 0; }

public:
int ID;
~MySingleton3(){ cout << _T("Destroy MySingleton3") << endl; }
void DoSomething(){ cout << _T("Do something here in MySingleton3, ID = ") << ID << endl; }
};
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
//第四种实现(《Design Patterns》里的,做了一些修改)
//(由类自身实现,手动与自动销毁对象)
#define ALLOW_SINGLETON(ClassName); /
private: /
static ClassName* _instance; /
/
public: /
static ClassName& GetInstanceRef() /
{ /
if (_instance == 0) /
_instance = new ClassName; /
return *_instance; /
} /
static ClassName* GetInstancePtr() /
{ /
return &GetInstanceRef(); /
} /
static ReleaseInstance() /
{ /
if (_instance != 0) /
{ /
delete _instance; /
_instance = 0; /
} /
} //End of ALLOW_SINGLETON(ClassName);

#define IMPLEMENT_SINGLETON(ClassName); /
ClassName* ClassName::_instance = 0; /
static class DestructHelper_##ClassName /
{ /
public: /
~DestructHelper_##ClassName(){ ClassName::ReleaseInstance(); } /
} DestructHelperInstance_##ClassName;
//End of IMPLEMENT_SINGLE(ClassName);

class MySingleton4
{
private:
MySingleton4(){ cout << _T("Construct MySingleton4") << endl; } //构造函数私有
~MySingleton4(){ cout << _T("Destroy MySingleton4") << endl; } //析构函数放哪里都可以
ALLOW_SINGLETON(MySingleton4);

public:
void DoSomething(){ cout << _T("Do something here in MySingleton4") << endl; }
};
IMPLEMENT_SINGLETON(MySingleton4);
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
//测试
void _tmain(int argc, char *argv[])
{
//测试第一种实现
cout << _T("**************Test of the first implementation***************") << endl;
MySingleton1* myobj1;
myobj1 = GetInstancePtr<MySingleton1>();
myobj1->DoSomething();
GetInstanceRef<MySingleton1>().DoSomething();

//测试第二种实现
cout << endl << _T("**************Test of the second implementation**************") << endl;
MySingleton2* myobj2;
myobj2 = SingletonWraper<MySingleton2>::GetInstancePtr();
myobj2->DoSomething();
//MySingleton2 myobj22(*myobj2); //Error
MySingleton2::SingletonInterface::GetInstanceRef().DoSomething();

//测试第三种实现
cout << endl << _T("**************Test of the third implementation***************") << endl;
MySingleton3 *myobj3 = MySingleton3::GetInstancePtr();
myobj3->ID = 1;
myobj3->DoSomething();
MySingleton3& myobj33 = MySingleton3::GetInstanceRef();
myobj33 = *myobj3;
try
{
delete myobj3;
}
catch(...)
{
cout << _T("Your object cannot be deleted.") << endl;
}
myobj33.ID = 2;
myobj33.DoSomething();
myobj3->DoSomething();

//测试第四种实现
cout << endl << _T("**************Test of the fourth implementation**************") << endl;
MySingleton4 *myobj4 = MySingleton4::GetInstancePtr();
myobj4->DoSomething();
MySingleton4::GetInstanceRef().DoSomething();

cout << _T("**********************End of all testing*********************") << endl << endl;
cout << _T("Following is the Automatic Garbage Collection process:") << endl << endl;
}
////////////////////////////////////////////////////////////////////

[附件二:演示程序运行结果]
**************Test of the first implementation***************
Construct MySingleton1
Do something here in MySingleton1
Do something here in MySingleton1

**************Test of the second implementation**************
Construct MySingleton2
Do something here in MySingleton2
Do something here in MySingleton2

**************Test of the third implementation***************
Construct MySingleton3
Do something here in MySingleton3, ID = 1
Destroy MySingleton3
Your object cannot be deleted.
Do something here in MySingleton3, ID = 2
Do something here in MySingleton3, ID = 2

**************Test of the fourth implementation**************
Construct MySingleton4
Do something here in MySingleton4
Do something here in MySingleton4
**********************End of all testing*********************

Following is the Automatic Garbage Collection process:

Destroy MySingleton3
Destroy MySingleton2
Destroy MySingleton1
Destroy MySingleton4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: