[附件一:演示程序代码清单]<o:p></o:p>
/*//<o:p></o:p>
作者:张友邦<o:p></o:p>
时间:2002年10月9日<o:p></o:p>
描述:实现Singleton<o:p></o:p>
/*//<o:p></o:p>
<o:p></o:p>
#include <iostream.h><o:p></o:p>
#include <tchar.h><o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//第一种实现(使用模板函数)<o:p></o:p>
class MySingleton1<o:p></o:p>
{<o:p></o:p>
private:<o:p></o:p>
MySingleton1(){ cout << _T("Construct MySingleton1") << endl; }<o:p></o:p>
MySingleton1 & operator =(const MySingleton1&){}<o:p></o:p>
template <typename T><o:p></o:p>
friend T& GetInstanceRef();<o:p></o:p>
<o:p></o:p>
public:<o:p></o:p>
~MySingleton1(){ cout << _T("Destroy MySingleton1") << endl; }<o:p></o:p>
<o:p></o:p>
public:<o:p></o:p>
void DoSomething(){ cout << _T("Do something here in MySingleton1") << endl; }<o:p></o:p>
};<o:p></o:p>
template <typename T><o:p></o:p>
T& GetInstanceRef()<o:p></o:p>
{<o:p></o:p>
static T _instance;<o:p></o:p>
return _instance;<o:p></o:p>
}<o:p></o:p>
template <typename T><o:p></o:p>
T* GetInstancePtr()<o:p></o:p>
{<o:p></o:p>
return &GetInstanceRef<T>();<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//第二种实现(使用模板类)<o:p></o:p>
template <typename T><o:p></o:p>
class SingletonWraper<o:p></o:p>
{<o:p></o:p>
public:<o:p></o:p>
static T& GetInstanceRef()<o:p></o:p>
{<o:p></o:p>
static T _instance;<o:p></o:p>
return _instance;<o:p></o:p>
}<o:p></o:p>
static const T& GetInstanceConst()<o:p></o:p>
{<o:p></o:p>
return GetInstanceRef();<o:p></o:p>
}<o:p></o:p>
static T* GetInstancePtr()<o:p></o:p>
{<o:p></o:p>
return &GetInstanceRef();<o:p></o:p>
}<o:p></o:p>
};<o:p></o:p>
#define DEFINE_SINGLETON(ClassName); \<o:p></o:p>
public: \<o:p></o:p>
friend class SingletonWraper<ClassName>; \<o:p></o:p>
typedef class SingletonWraper<ClassName> SingletonWraper; \<o:p></o:p>
typedef SingletonWraper SingletonInterface; \<o:p></o:p>
private: \<o:p></o:p>
const ClassName& operator=(const ClassName&) \<o:p></o:p>
{ \<o:p></o:p>
return SingletonInterface::GetInstanceRef(); \<o:p></o:p>
} \<o:p></o:p>
ClassName(const ClassName&); \<o:p></o:p>
private: \<o:p></o:p>
static void operator delete(void *p, size_t n) \<o:p></o:p>
{ \<o:p></o:p>
throw -1; \<o:p></o:p>
}//End of define DECLARE_SINGLETON(ClassName);<o:p></o:p>
<o:p></o:p>
class MySingleton2<o:p></o:p>
{<o:p></o:p>
DEFINE_SINGLETON(MySingleton2);<o:p></o:p>
private:<o:p></o:p>
MySingleton2(){ cout << _T("Construct MySingleton2") << endl; }<o:p></o:p>
<o:p></o:p>
public:<o:p></o:p>
~MySingleton2(){ cout << _T("Destroy MySingleton2") << endl; }<o:p></o:p>
public:<o:p></o:p>
void DoSomething(){ cout << _T("Do something here in MySingleton2") << " " << endl; }<o:p></o:p>
};<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//第三种实现(由类自身实现,自动销毁对象,相比之下,它更简单)<o:p></o:p>
#define DECLARE_SINGLETON(ClassName); \<o:p></o:p>
public: \<o:p></o:p>
static ClassName& GetInstanceRef() \<o:p></o:p>
{ \<o:p></o:p>
static ClassName _instance; \<o:p></o:p>
return _instance; \<o:p></o:p>
} \<o:p></o:p>
static const ClassName& GetInstanceConst() \<o:p></o:p>
{ \<o:p></o:p>
return GetInstanceRef(); \<o:p></o:p>
} \<o:p></o:p>
static ClassName* GetInstancePtr() \<o:p></o:p>
{ \<o:p></o:p>
return &GetInstanceRef(); \<o:p></o:p>
} \<o:p></o:p>
const ClassName& operator=(const ClassName&) \<o:p></o:p>
{ \<o:p></o:p>
return GetInstanceRef(); \<o:p></o:p>
} \<o:p></o:p>
private: \<o:p></o:p>
ClassName(const ClassName&); \<o:p></o:p>
static void operator delete(void *p, size_t n) \<o:p></o:p>
{ \<o:p></o:p>
throw -1; \<o:p></o:p>
}//End of define DECLARE_SINGLETON(ClassName);<o:p></o:p>
<o:p></o:p>
class MySingleton3<o:p></o:p>
{<o:p></o:p>
DECLARE_SINGLETON(MySingleton3);<o:p></o:p>
<o:p></o:p>
private:<o:p></o:p>
MySingleton3(){ cout << _T("Construct MySingleton3") << endl; ID = 0; }<o:p></o:p>
<o:p></o:p>
public:<o:p></o:p>
int ID;<o:p></o:p>
~MySingleton3(){ cout << _T("Destroy MySingleton3") << endl; }<o:p></o:p>
void DoSomething(){ cout << _T("Do something here in MySingleton3, ID = ") << ID << endl; }<o:p></o:p>
};<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//第四种实现(《Design Patterns》里的,做了一些修改)<o:p></o:p>
//(由类自身实现,手动与自动销毁对象)<o:p></o:p>
#define ALLOW_SINGLETON(ClassName); \<o:p></o:p>
private: \<o:p></o:p>
static ClassName* _instance; \<o:p></o:p>
\<o:p></o:p>
public: \<o:p></o:p>
static ClassName& GetInstanceRef() \<o:p></o:p>
{ \<o:p></o:p>
if (_instance == 0) \<o:p></o:p>
_instance = new ClassName; \<o:p></o:p>
return *_instance; \<o:p></o:p>
} \<o:p></o:p>
static ClassName* GetInstancePtr() \<o:p></o:p>
{ \<o:p></o:p>
return &GetInstanceRef(); \<o:p></o:p>
} \<o:p></o:p>
static ReleaseInstance() \<o:p></o:p>
{ \<o:p></o:p>
if (_instance != 0) \<o:p></o:p>
{ \<o:p></o:p>
delete _instance; \<o:p></o:p>
_instance = 0; \<o:p></o:p>
} \<o:p></o:p>
} //End of ALLOW_SINGLETON(ClassName);<o:p></o:p>
<o:p></o:p>
#define IMPLEMENT_SINGLETON(ClassName); \<o:p></o:p>
ClassName* ClassName::_instance = 0; \<o:p></o:p>
static class DestructHelper_##ClassName \<o:p></o:p>
{ \<o:p></o:p>
public: \<o:p></o:p>
~DestructHelper_##ClassName(){ ClassName::ReleaseInstance(); } \<o:p></o:p>
} DestructHelperInstance_##ClassName;<o:p></o:p>
//End of IMPLEMENT_SINGLE(ClassName);<o:p></o:p>
<o:p></o:p>
class MySingleton4<o:p></o:p>
{<o:p></o:p>
private:<o:p></o:p>
MySingleton4(){ cout << _T("Construct MySingleton4") << endl; } //构造函数私有<o:p></o:p>
~MySingleton4(){ cout << _T("Destroy MySingleton4") << endl; } //析构函数放哪里都可以<o:p></o:p>
ALLOW_SINGLETON(MySingleton4);<o:p></o:p>
<o:p></o:p>
public:<o:p></o:p>
void DoSomething(){ cout << _T("Do something here in MySingleton4") << endl; }<o:p></o:p>
};<o:p></o:p>
IMPLEMENT_SINGLETON(MySingleton4);<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//测试<o:p></o:p>
void _tmain(int argc, char *argv[])<o:p></o:p>
{<o:p></o:p>
//测试第一种实现<o:p></o:p>
cout << _T("**************Test of the first implementation***************") << endl;<o:p></o:p>
MySingleton1* myobj1;<o:p></o:p>
myobj1 = GetInstancePtr<MySingleton1>();<o:p></o:p>
myobj1->DoSomething();<o:p></o:p>
GetInstanceRef<MySingleton1>().DoSomething();<o:p></o:p>
<o:p></o:p>
//测试第二种实现<o:p></o:p>
cout << endl << _T("**************Test of the second implementation**************") << endl;<o:p></o:p>
MySingleton2* myobj2;<o:p></o:p>
myobj2 = SingletonWraper<MySingleton2>::GetInstancePtr();<o:p></o:p>
myobj2->DoSomething();<o:p></o:p>
//MySingleton2 myobj22(*myobj2); //Error<o:p></o:p>
MySingleton2::SingletonInterface::GetInstanceRef().DoSomething();<o:p></o:p>
<o:p></o:p>
//测试第三种实现<o:p></o:p>
cout << endl << _T("**************Test of the third implementation***************") << endl;<o:p></o:p>
MySingleton3 *myobj3 = MySingleton3::GetInstancePtr();<o:p></o:p>
myobj3->ID = 1;<o:p></o:p>
myobj3->DoSomething();<o:p></o:p>
MySingleton3& myobj33 = MySingleton3::GetInstanceRef();<o:p></o:p>
myobj33 = *myobj3;<o:p></o:p>
try<o:p></o:p>
{<o:p></o:p>
delete myobj3;<o:p></o:p>
}<o:p></o:p>
catch(...)<o:p></o:p>
{<o:p></o:p>
cout << _T("Your object cannot be deleted.") << endl;<o:p></o:p>
}<o:p></o:p>
myobj33.ID = 2;<o:p></o:p>
myobj33.DoSomething();<o:p></o:p>
myobj3->DoSomething();<o:p></o:p>
<o:p></o:p>
//测试第四种实现<o:p></o:p>
cout << endl << _T("**************Test of the fourth implementation**************") << endl;<o:p></o:p>
MySingleton4 *myobj4 = MySingleton4::GetInstancePtr();<o:p></o:p>
myobj4->DoSomething();<o:p></o:p>
MySingleton4::GetInstanceRef().DoSomething();<o:p></o:p>
<o:p></o:p>
cout << _T("**********************End of all testing*********************") << endl << endl;<o:p></o:p>
cout << _T("Following is the Automatic Garbage Collection process:") << endl << endl;<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
[附件二:演示程序运行结果]<o:p></o:p>
**************Test of the first implementation***************<o:p></o:p>
Construct MySingleton1<o:p></o:p>
Do something here in MySingleton1<o:p></o:p>
Do something here in MySingleton1<o:p></o:p>
<o:p></o:p>
**************Test of the second implementation**************<o:p></o:p>
Construct MySingleton2<o:p></o:p>
Do something here in MySingleton2<o:p></o:p>
Do something here in MySingleton2<o:p></o:p>
<o:p></o:p>
**************Test of the third implementation***************<o:p></o:p>
Construct MySingleton3<o:p></o:p>
Do something here in MySingleton3, ID = 1<o:p></o:p>
Destroy MySingleton3<o:p></o:p>
Your object cannot be deleted.<o:p></o:p>
Do something here in MySingleton3, ID = 2<o:p></o:p>
Do something here in MySingleton3, ID = 2<o:p></o:p>
<o:p></o:p>
**************Test of the fourth implementation**************<o:p></o:p>
Construct MySingleton4<o:p></o:p>
Do something here in MySingleton4<o:p></o:p>
Do something here in MySingleton4<o:p></o:p>
**********************End of all testing*********************<o:p></o:p>
<o:p></o:p>
Following is the Automatic Garbage Collection process:<o:p></o:p>
<o:p></o:p>
Destroy MySingleton3<o:p></o:p>
Destroy MySingleton2<o:p></o:p>
Destroy MySingleton1<o:p></o:p>
Destroy MySingleton4