教科书上的Singleton定义如下:
class Singleton Singleton* Singleton::_instance = 0 ; Singleton* Singleton::Instance() _instance = new Singleton() : } return _instance ; |
(1)因为返回的是指针,为防止用户调用delete函数,可把static Singleton *_instance;改为在Instance()中定义static Singleton _instance。这样显然更安全,同时也具有lazy initialization的特性(即第一次访问时才创建)。
(2)假设需要从Singleton派生子类,而子类也需要有同样的性质,既只能创建一个实例。我觉得,这很难办。根本原因在于Instance()函数不是虚函数,不具有多态的性质。一种常用方法是把Instance()函数移到子类中,这时就只能用static Singleton *_instance,而不能用static Singleton _instance了,除非把_instance也要移到子类,无论怎么做都不优雅。另一种方法是用模板。具体用什么方法,只能根据实际情况权衡。
示例代码:
将Gramanager设为单体类,其中RemoveDecorator为全局函数,m_pGraphic为Gramanager的成员变量。
class Gramanager
{
public:
static Gramanager* Instance();
protected:
Gramanager(){};
private:
static Gramanager* _instance;
list<MGraphic*> m_pGraphic;
public:
void RemoveDecorator();
};
实现;
#include "Myfigure.h"
Gramanager* Gramanager::_instance=0;
Gramanager* Gramanager::Instance(){
if( _instance == 0){
_instance = new Gramanager();
}
return _instance;
}
void Gramanager::RemoveDecorator()
{
list<MGraphic*>::iterator it;
for(it=m_pGraphic.begin();it!=m_pGraphic.end();it++)
{
delete(*it);
}
}
在view使用,
Gramanager::Instance()->RemoveDecorator()
用户159579 2011-7-4 09:58
用户367863 2011-7-4 09:32