单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案
在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其默认构造函数和拷贝构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
#include<iostream> #include<string> using namespace std; class single { private: single(){}; //默认构造函数 single(const single &p){};//拷贝构造函数 public: static single * getinstance() { return pointer;} void test(string a) { cout<<a<<endl;} private: static single *pointer; }; single* single::pointer=new single; int main() { string b="单例模式"; single *s1=single::getinstance();//唯一访问的接口 s1->test(b); }
首先将 默认构造函数和拷贝构造函数设置为private
这样设置以后 就无法创建 single s1;single s2;这样不同的实例,它们创建的时候就需要调用默认构造函数 私有后无法访问
为什么拷贝构造函数也要私有化? 如果我在 single* s1=single::getinstance();下面再创建一个 single*s2= single1::getlinstance();
此时这两个指针访问的是同一个对象,但是我再加上一句:single * s3= new single(*s2);此时会调用拷贝构造函数,由于是new
出来的空间,是一个深拷贝,s2和s3 所访问的地址是不一样的,为了满足单例模式的要求,所以拷贝构造函数也要私有化。
下面是代码的测试:
#include<iostream> #include<string> using namespace std; class single { private: single(){}; //默认构造函数 public: static single * getinstance() { return pointer;} void test(string a) { cout<<a<<endl;} private: static single *pointer; }; single* single::pointer=new single; int main() { string b="单例模式"; single *s1=single::getinstance();//唯一访问的接口 single *s2=single::getinstance(); single *s3=new single(*s2); if(s1==s2){cout<<"s1等于s2"<<endl;} if(s2!=s3){cout<<"s2不等于s3"<<endl;} s1->test(b); }
测试的结果
接下来是再内部维护一个指针,这个指针也设置成private 如果再public中 用single*s1 =single::pointer去访问;那我是不是可以设置single *s1=NULL;为了防止这种情况将维护的指针设置为私有
同时他是一个静态成员变量,在类的外部进行初始化。
最后在public中 设置一个静态成员函数提供一个访问的接口。
原文链接: https://www.cnblogs.com/zbf940114/p/13460612.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/201243
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!