可被继承的
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>
完了,简单不过还挺实用,希望你喜欢
~~~