c++中的单例类模板的实现方法详解

  

  

在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(单一实例)。如超市收银系统,其外观主要由显示器(1个),扫描枪(1个),收款箱(1个)组成,在系统正常运行期间这三部分都是唯一存在的,也就是说,显示器,扫描枪,收款箱这三部分都应该有各自的类,并且每个类只能唯一地实例化一个对象,基于这种模式的程序设计,称为单例模式。

  

! ! !单例模式只能创建一个对象,且该对象的生命周期伴随系统的整个运行期间。

  


  

  

思考:如何定义一个类,使得这个类最多只能创建一个对象?

  

分析:因为对象是由构造函数创建的,所以我们应该将问题锁定在构造函数上;又因为只能创建一个对象,这就意味着只能调用一次构造函数;显然将构造函数的访问权限设置为公众不合适,所以,构造函数的访问权限只能是私有的。然后,定义一个私有的静态成员c_instance=NULL和公有的静态成员函数,通过,c_instance来判断是否创建对象。(这个为什么要使用静态成员呢?因为构造函数是私有的,在类的外部无法创建对象,只能通过类名调用静态成员,而静态成员函数只能调用静态成员变量)

  

上述分析过程可简化为:

  

(1)将构造函数的访问属性设置为私人;

  

(2)定义私有的静态成员属性实例并初始化为零;

  

(3)当需要使用对象时,访问实例的值;

  

,,,,,,,,,,1)空值:创建对象,并用实例标记,

  

,,,,,,,,,,2)非空值:返回实例标记的对象,

  

<强>单例模式实现

        # include & lt; iostream>   # include & lt; string>      使用名称空间性病;      类SObject   {   静态SObject * c_instance;//定义标识符指针;/*不需用拷贝和赋值,在单例模式中,始终只有一个对象*/SObject (const SObject&);   SObject&运算符=(const SObject&);      SObject()//私有的构造函数   {   }   公众:   静态SObject * GetInstance ();//创建对象的入口      无效的print ()   {   cout & lt; & lt;“这=" & lt; & lt;这& lt; & lt;endl;   }   };      SObject * SObject: c_instance=零;//静态成员类内声明,类外定义      SObject * SObject: GetInstance()//单例模式的关键   {   如果(c_instance==NULL)   {   c_instance=new SObject ();   }      返回c_instance;   }      int main ()   {   SObject * s=SObject: GetInstance ();   SObject * s1=SObject: GetInstance ();   SObject * s2=SObject: GetInstance ();      年代→打印();//=0 x940a008   s1→打印();//=0 x940a008   s2→打印();//=0 x940a008      返回0;   }//注:单例模式中,对象的生命周期存在整个系统运行过程中,所以是绝对不释放的;      之前      

时间·大敌;;其实,在上述的单例模式实现案列中,有一部分代码(分析过程中第2、3步)与类本身没有任何关系,既然是这样,我们就把这部分单独提取出来处理。

  

问题所在:需要使用单例模式时,必须在每个类中定义静态成员变量c_instance和静态成员函数GetInstance();当有多个类都需要使用单例模式时,这样的实现方式明显的很冗余,为了能够代码复用,我们可以将这两部分抽象成一个新类(做成类模板,声明为其它类的友元类,这样与之前的效果一样)。

  

<>强基于类模板的单例模式实现

     //对上个单例模式实现代码的改进//单例。水电单例模式代码   的ifndef SINGLETON_H   #定义SINGLETON_H      模板   & lt;typename T比;   单例类   {   静态T * c_instance;   公众:   T *静态GetInstance ();   };      模板   & lt;typename T比;   T * Singleton   # include & lt; string>   # include“singleton.hpp”      使用名称空间性病;      类SObject   {   朋友类Singleton;//当前类需要使用单例模式      SObject (const SObject&);   SObject&运算符=(const SObject&);      SObject ()   {   }   公众:      无效的print ()   {   cout & lt; & lt;“这=" & lt; & lt;这& lt; & lt;endl;   }   };      int main ()   {   SObject * s=Singleton

c++中的单例类模板的实现方法详解