模板singleton模式的C++实现

时间:2023-03-10 07:07:42
模板singleton模式的C++实现

模板singleton模式的C++实现

  近期回过头整理了一下singleton模式,看了别人写的关于singleton的介绍。发现这个singleton模式虽然简单,但要写一个稳定/线程安全/泛型的模板singleton,还是需要一点技巧的。经过整理,要写一个模板的singlton至少需要以下几个知识点:

1:singleton

2:static类成员实例延迟创建。

3:static类实例创建互斥实现,即线程安全。

4:double check技巧。  【Ref:http://www.ibm.com/developerworks/library/j-dcl/index.html】

5:模板。

6:static成员变量初始化。

7:singleton关闭类实例

下面上singleton实现代码,测试可用。

 #pragma once
/************************************************************************
singleton模式类模板
1:延迟创建类实例 2:double check 3:互斥访问 4:模板
************************************************************************/
#ifndef WHG_SINGLETON
#define WHG_SINGLETON #include "ThreadLockCs.h" template<class T>
class CSingleton
{
private:
static T* _instance;
CSingleton(void);
static CThreadLockCs lcs;
public:
static T* Instance(void);
static void Close(void);
}; //模板类static变量
template<class T>
T* CSingleton<T>::_instance = NULL; template<class T>
CThreadLockCs CSingleton<T>::lcs; //模板类方法实现
template<class T>
CSingleton<T>::CSingleton(void)
{
} template<class T>
T* CSingleton<T>::Instance(void)
{
//double-check
//延迟创建,只有调用方访问Instance才会创建类实例
if (_instance == NULL)
{
//互斥访问锁,用CriticalSection实现
lcs.lock();
if (_instance == NULL)
{
_instance = new T;
}
lcs.unlock();
}
return _instance;
} template<class T>
void CSingleton<T>::Close(void)
{
if (_instance)
{
delete _instance;
}
} #endif

CSingleton内用到的CThreadLockCs 实现如下:

 //互斥访问锁
#ifndef WHG_THREAD_LOCKCS
#define WHG_THREAD_LOCKCS //#include <Windows.h> class CThreadLockCs
{
public:
CThreadLockCs(){InitializeCriticalSection(&m_cs);}
~CThreadLockCs(){DeleteCriticalSection(&m_cs);}
void lock(){EnterCriticalSection(&m_cs);}
void unlock(){LeaveCriticalSection(&m_cs);}
private:
CRITICAL_SECTION m_cs;
};
#endif

调用方法很简单:

1:用typedef申明一个变量名

 typedef CSingleton<CListen>    LISTEN;

2:调用的地方写

 LISTEN::Instance()->SetAddress(,"127.0.0.1");

3:关闭的地方写

 LISTEN::Close();