Design Pattern无疑是每个程序员都应该阅读的一本书,这本书给出了23个Pattern,其中最简单的就是Singleton Pattern了,这里,我大概介绍一下自己使用Singleton时曾经用到过的一些做法,希望对大家有些帮助。
意图
Single Pattern的主要是为了保证类仅有一个实例,并保证提供一个访问它的全局访问点
适用情况
一个对象的行为取决于它的状态,并且它必须在运行时改变它的状态
一个操作包含庞大的Switch&Case语句
优点
它将和特定状态相关的行为局部化了,这样就可以通过定义新的子类来增加新的状态和转换。
做法1:
因为在书中并没有提及如何删除m_pInstance指针,所以就提供exitInstance()方法手动删除
class CSingleton
{
public:
virtual ~CSingleton();
static CSingleton* instance(void)
{
if(NULL == m_pInstance)
return m_pInstance = new CSingleton;
return m_pInstance;
}
void exitInstance(void)
{ delete m_pInstance;}
private
CSingleton();
static T* m_pInstance;
}
CSingleton* CSingleton::m_pInstance = NULL;
做法2:
在类中增加一个嵌套类,让这个嵌套类负责删除m_pInstance(类似于auto_ptr的原理)
class CSingleton
{
public:
virtual ~CSingleton();
static CSingleton* Instance()
{
if(NULL == m_pInstance)
m_pInstance = new CSingleton;
return m_pInstance;
}
private:
CSingleton();
static CSingleton* m_pInstance;
class Cleaner
{
public:
~Cleaner()
{ delete m_pInstance;}
}
friend class CSingleton::Cleaner;
static CSingleton::Cleaner cleaner;
}
CSingleton *CSingleton::m_pInstance = NULL;
CSingleton::Cleaner CSingleton::cleaner;
做法3:
使用template的特性,建一个关于Singleton的template class,任何想使用Singleton Pattern的类只需要从它这里继承就可以了
template <typename T>
class CSingleton
{
public:
static T* instance(void)
{
static T instance;
return &instance;
}
protected:
CSingleton(){};
virtual ~CSingleton(){};
private:
CSingleton(const CSingleton& source){};
};
如果类CTest想使用Singleton特性
CTest : public CSingleton<CTest>
{
friend CSingleton<CTest>;
CTest();
public:
~CTest();
}
目前我用的就是最后一种方法,用起来比较方便,不用对每个需要使用类似技巧的类都写一大堆代码。
希望对大家有所帮助