可被继承的singleton
Singleton模式在日常工作中的使用频率应当是很高的。一般的全局数据,全局函数等都可以放入一个Singleton类中。Singleton模式是如此的熟为人知,以至于许多的C++大拿都有专门论述。如果你想非常全面地了解它,建议读读四人帮的设计模式,读读LOKI库等。就我个人而言,大多数情况下我使用Singleton都不需要对它有很苛刻的要求,如生存时间等。
一个简单化的Singleton是很容易实现的,不过如果你每次都需要自己去实现它,难免有点不痛快,一个简单的除掉这个不痛快的方式就是写一个基类,提供一套Singleton设施,需要的时候继承自它就可以了。
不罗嗦了,俺03年写的一个东西,没几行代码:
/*******************************************************************
** Program : 可被继承的Singleton模式。
** Author : 吴龙为
** Version : 2.0
** Date : 2003-3-23
Copyright(c) 2003, all rights reserved. 欢迎随意修改使用,但请保留这份声明,如有修改,盼能发一份给我学习. Mail: kingdark@vip.sina.com
********************************************************************/
template<class SubClass>
class Singleton
{
private:
static SubClass *_instance;
static bool _create_by_instance; //避免派生类使用 Instance 函数以外的方法创建对象
public:
static SubClass * Instance();
protected:
Singleton()
{
if(!_create_by_instance)
throw std::runtime_error ("this is a singleton,you must create object by call function Instance");
}
private:
Singleton(const Singleton & );
Singleton & operator = ( const Singleton & rhs ) ;
};
template<class SubClass>
SubClass * Singleton<SubClass>::Instance ()
{
if( _instance == 0)
{
_create_by_instance = true; //表明调用者身份
_instance = new SubClass();
_create_by_instance = false; //注销调用者身份
}
return _instance;
}
template<class SubClass>
SubClass * Singleton<SubClass>::_instance = 0;
template<class SubClass>
bool Singleton<SubClass>::_create_by_instance = 0;
** Program : 可被继承的Singleton模式。
** Author : 吴龙为
** Version : 2.0
** Date : 2003-3-23
Copyright(c) 2003, all rights reserved. 欢迎随意修改使用,但请保留这份声明,如有修改,盼能发一份给我学习. Mail: kingdark@vip.sina.com
********************************************************************/
template<class SubClass>
class Singleton
{
private:
static SubClass *_instance;
static bool _create_by_instance; //避免派生类使用 Instance 函数以外的方法创建对象
public:
static SubClass * Instance();
protected:
Singleton()
{
if(!_create_by_instance)
throw std::runtime_error ("this is a singleton,you must create object by call function Instance");
}
private:
Singleton(const Singleton & );
Singleton & operator = ( const Singleton & rhs ) ;
};
template<class SubClass>
SubClass * Singleton<SubClass>::Instance ()
{
if( _instance == 0)
{
_create_by_instance = true; //表明调用者身份
_instance = new SubClass();
_create_by_instance = false; //注销调用者身份
}
return _instance;
}
template<class SubClass>
SubClass * Singleton<SubClass>::_instance = 0;
template<class SubClass>
bool Singleton<SubClass>::_create_by_instance = 0;
这个Singleton有限制条件:继承自它的类必须有无参数构造函数。对这一点有异议的话,可以重新修改一下,加点模板参数之类的。
使用相当简单,假如你有个 Global 类,需要做成一个Singleton,这样:
class Global : public Singleton<Global>
完了,简单不过还挺实用,希望你喜欢~~~