以前看过高手写的单例实现,也是利用继承模板基类来实现,最近正要用到单例模式,却苦于找不到以前高手的代码,于是就自己动手实现,代码如下
template<typename T>
class Singletion
{
friend T;
private:
Singletion(){}
virtual ~Singletion(){}
static T* pObject;
//利用此类析构函数释放单例实例内存
class CCarbageCollector
{
public:
~CCarbageCollector()
{
printf("~CCarbageCollector");
if(Singletion<T>::pObject != NULL)
{
delete Singletion<T>::pObject;
printf("Object delete");
}
}
};
protected:
//提供给单例类的初始化接口
virtual void Init()=0;
public:
//获取单例
inline static T* GetSingleton()
{
//用于系统退出时释放单例实例的内存
static Singletion<T>::CCarbageCollector CarCo;
pObject==NULL && (pObject=new T);
return pObject;
}
};
template<typename T>
T* Singletion<T>::pObject = NULL;
#define SINGLETON_INIT(ClassType)\
friend ClassType* Singletion<ClassType>::GetSingleton();\
friend Singletion<ClassType>::CCarbageCollector;\
private:\
ClassType(){Init();}\
virtual ~ClassType(){}\
virtual void Init()
//单例
class B:public Singletion<B>
{
SINGLETON_INIT(B)
{
printf("Singleton Init");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
B *b = B::GetSingleton();
//B bb; //->error
//new B; //->error
::system("pause");
}