单例模式实现
这是一个单例模板类
#pragma once template <typename T> class CSingletonT { public: static T *Instance() { return m_pObj; } class CDeconstructor { public: CDeconstructor() { if (NULL == m_pObj) { m_pObj = new T(); } } ~CDeconstructor() { if (CSingletonT::m_pObj) {delete CSingletonT::m_pObj; CSingletonT::m_pObj = NULL; } } }; protected: CSingletonT(void){} virtual ~CSingletonT(void){} protected: static T * m_pObj; static CDeconstructor m_dec; };
使用的时候继承这个模板即可,比如:
#pragma once #include "WebRef.h" #include "SingletonT.h" using Service1::CService1; class CWebAccess : public CSingletonT<CWebAccess> { friend class CSingletonT<CWebAccess>; friend class CSingletonT<CWebAccess>::CDeconstructor; public: CService1 *GetService(); void SetServiceUrl(const CString& strUrl); protected: CService1 m_service; virtual ~CWebAccess(void){} CWebAccess(void){} }; CSingletonT<CWebAccess>::CDeconstructor CSingletonT<CWebAccess>::m_dec; CWebAccess* CSingletonT<CWebAccess>::m_pObj = NULL;
模板类的两个static成要定义一下,头文件里只是声明。由于m_dec是静态成员,会在main函数执行之前构造,main退出后析构,所以这里使用这种特性来创建单例的实例变量,就可以不用锁来实现线程安全。一个良好的结构是main函数不会在main之前就有多线程的。