模式实现:可被继承的 Singleton

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值