对Singleton使用方法的总结

王朝网络·vc·作者佚名  2006-01-08
宽屏版  字体: |||超大  

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();

}

目前我用的就是最后一种方法,用起来比较方便,不用对每个需要使用类似技巧的类都写一大堆代码。

希望对大家有所帮助

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有