c++中的单例类模板的实现方法详解
1、什么是单例模式
在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在(SingleInstance)。如超市收银系统,其外观主要由显示器(1个)、扫描枪(1个)、收款箱(1个)组成,在系统正常运行期间这三部分都是唯一存在的;也就是说,显示器、扫描枪、收款箱这三部分都应该有各自的类,并且每个类只能唯一地实例化一个对象,基于这种模式的程序设计,称为单例模式。
!!!单例模式只能创建一个对象,且该对象的生命周期伴随系统的整个运行期间。
2、怎么实现单例模式
思考:如何定义一个类,使得这个类最多只能创建一个对象?
分析:因为对象是由构造函数创建的,所以我们应该将问题锁定在构造函数上;又因为只能创建一个对象,这就意味着只能调用一次构造函数;显然将构造函数的访问权限设置为public不合适,所以,构造函数的访问权限只能是private。然后,定义一个私有的静态成员c_instance=NULL和公有的静态成员函数,通过 c_instance来判断是否创建对象。(这个为什么要使用静态成员呢?因为构造函数是私有的,在类的外部无法创建对象,只能通过类名调用静态成员,而静态成员函数只能调用静态成员变量)
上述分析过程可简化为:
(1)将构造函数的访问属性设置为private;
(2)定义私有的静态成员属性instance并初始化为NULL;
(3)当需要使用对象时,访问instance的值;
1)空值:创建对象,并用instance标记;
2)非空值:返回instance标记的对象;
单例模式实现
#include#include usingnamespacestd; classSObject { staticSObject*c_instance;//定义标识符指针; /*不需用拷贝和赋值,在单例模式中,始终只有一个对象*/ SObject(constSObject&); SObject&operator=(constSObject&); SObject()//私有的构造函数 { } public: staticSObject*GetInstance();//创建对象的入口 voidprint() { cout<<"this="< print();//this=0x940a008 s1->print();//this=0x940a008 s2->print();//this=0x940a008 return0; } //注:单例模式中,对象的生命周期存在整个系统运行过程中,所以是绝对不释放的;
· 其实,在上述的单例模式实现案列中,有一部分代码(分析过程中第2、3步)与类本身没有任何关系,既然是这样,我们就把这部分单独提取出来处理。
问题所在:需要使用单例模式时,必须在每个类中定义静态成员变量c_instance和静态成员函数GetInstance();当有多个类都需要使用单例模式时,这样的实现方式明显的很冗余,为了能够代码复用,我们可以将这两部分抽象成一个新类(做成类模板,声明为其它类的友元类,这样与之前的效果一样)。
基于类模板的单例模式实现
//对上个单例模式实现代码的改进 //singleton.hpp单例模式代码 #ifndefSINGLETON_H #defineSINGLETON_H templateclassSingleton { staticT*c_instance; public: staticT*GetInstance(); }; template T*Singleton ::c_instance=NULL; template T*Singleton ::GetInstance() { if(c_instance==NULL) { c_instance=newT(); } returnc_instance; } #endif //main.cpp测试文件 #include #include #include"singleton.hpp" usingnamespacestd; classSObject { friendclassSingleton ;//当前类需要使用单例模式 SObject(constSObject&); SObject&operator=(constSObject&); SObject() { } public: voidprint() { cout<<"this="< ::GetInstance(); SObject*s1=Singleton ::GetInstance(); SObject*s2=Singleton ::GetInstance(); s->print();//0xe63c20 s1->print();//0xe63c20 s2->print();//0xe63c20 return0; }
在今后工作中,如果一个类(SObject)要使用单例模式(Singleton单例模式的类模板),只需三步骤:
(1)类(SObject)的构造函数必须私有化;同时,拷贝构造函数、重载=操作符也私有化;
(2)将单例模式的类模板声明为这个类的友元类;friendclassSingleton
(3)通过单例模式类模板中SObject*s=Singleton
到此这篇关于c++中的单例类模板的实现方法详解的文章就介绍到这了,更多相关c++单例类模板内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。