模式实现:可被继承的 Singleton

来源:互联网 发布:淘宝怎么退款申请 编辑:程序博客网 时间:2024/06/03 12:27
 
可被继承的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;
 
        这个Singleton有限制条件:继承自它的类必须有无参数构造函数。对这一点有异议的话,可以重新修改一下,加点模板参数之类的。
 
       使用相当简单,假如你有个 Global 类,需要做成一个Singleton,这样:
       class Global : public Singleton<Global>
 
       完了,简单不过还挺实用,希望你喜欢~~~