c++ 单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案
在单例类的内部实现只生成一个实例,同时它提供一个静态的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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- DVWA-对Command Injection(命令注入)的简单演示与分析
- 如何探测内网存活主机
- Java ServletContext详解
- Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)
- 实战记录之SQL server报错手工注入
- 树莓派基础实验23:触摸开关传感器实验
- springmvc 文件下载 VS resteasy 文件上传下载
- Struts Scan工具的使用
- 树莓派基础实验24:超声波测距传感器实验
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
- 从spring boot 启动过程看apollo的初始化过程( 二)
- Apache IoTDB 系列教程-4:客户端接口
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
- Kali中密码暴力破解工具hydra的使用
- Apache IoTDB 系列教程-8:文件同步工具