C++模式学习------单例模式
单例(Singleton)模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。例如一些类是属于工具,配置,日志性质的,程序很多的地方会用到,若每次都去new会增加了开销,也不好管理。这时候我们只需要一个实例对象就可以。这里是可以采用全局或者静态变量的方式,不过全局量没有封装,可能会有误用影响其他地方的情况。
Lazy Singleton
class Singleton
{
public:
static Singleton& Instance()
//使用的时候初始化单例
{
if(instance == NULL)
instance = new Singleton;
return *instance;
} private: //为实现单例,需要将构造,复制构造都设为私有
Singleton();
~Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&); static Singleton* instance;
};
【这种模式不是线程安全的。多线程运行的时候,构造会出现问题。在这种情况下,需要加上互斥锁,来实现线程安全】
class Singleton
{
public:
static Singleton& Instance()
{
if(instance== NULL) //若未初始化则上锁初始化
{
Lock();//上锁
if(instance== NULL)
instance= new Singleton;
Unlock();//解锁
}
return *instance;
} private: //为实现单例需要将构造函数,复制构造函数设为私有
Singleton();
~Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&); static Singleton* instance;
};
Eager Singleton
class Singleton
{
public:
static Singleton& Instance()
//用的时候返回单例
{
return instance;
} private: //为实现单例,需要将构造,复制构造都设为私有
Singleton();
~Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&); static Singleton instance; //构造的时候初始化
};
【初始化的时候构造完成,因此是线程安全的】
Meyers Singleton
class Singleton
{
public:
static Singleton& Instance()
//第一次使用的时候构造
{
static Singleton instance;
return instance;
} private:
Singleton(); // 为实现单例,需要将构造复制构造设为私有
~Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
【在c++11之后这种模式是线程安全的】
C++模式学习------单例模式的更多相关文章
- .NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证
.NET责任链模式.单例模式.模板方法模式混用 前言 哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器.我们团队的成员 ...
- Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...
- State模式学习笔记
选用了一个假设需要用户验证的例子进行State模式学习,这个例子并不恰当.无所谓了,只要能学习到其中的内容即可. 适用性: 1,一个对象的行为取决于他的状态,并且它必须在运行时刻依据状态改变他的行为. ...
- SQL反模式学习笔记1 开篇
什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...
- SQL反模式学习笔记5 外键约束【不用钥匙的入口】
目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...
- SQL反模式学习笔记3 单纯的树
2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...
- SQL反模式学习笔记2 乱穿马路
程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标: 存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...
- SQL反模式学习笔记4 建立主键规范【需要ID】
目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...
- SQL反模式学习笔记6 支持可变属性【实体-属性-值】
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
随机推荐
- 服务器路由配置--Route
第1章 命令配置 虚拟服务器 网卡配置信息 虚拟网卡名称 虚拟网卡模式 服务器01 eth1 10.0.0.10/24 nat模式 服务器02 eth2 10.0.0.11/24 nat模式 eth3 ...
- JavaScript 数组——filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()
filter(): 语法: var filteredArray = array.filter(callback[, thisObject]); 参数说明: callback: 要对每个数组元素执行 ...
- FileDialog对象
返回表示文件对话框实例的 FileDialog 对象. 语法 expression. FileDialog( _fileDialogType_ ) expression:表示 Application ...
- aws存储桶s3使用
关于aws s3的使用说明: aws官方文档地址:https://docs.aws.amazon.com/s3/index.html#lang/zh_cn 创建s3与基础使用: 1.登陆aws控制台- ...
- Analysis 图标分析 - loadrunner
analysis常见 /
- 使用AD对Linux客户端进行身份验证
https://technet.microsoft.com/zh-cn/library/2008.12.linux.aspx
- 如何批量删除QQ浏览器指定历史记录和导出指定的历史记录
QQ浏览器的历史记录只有清空历史记录和删除选中项两个功能.有时我不想删除所有的历史记录,只是想删除指定的历史记录保留对自己有用的历史记录,方便自己以后查找.但是删除选中项功能只能一项一项的选择,才能批 ...
- 记一次nginx -t非常慢的排障经历
在一次修改nginx配置时候,执行 case: #/usr/local/nginx/sbin/nginx -t 出现执行命令出现很久没返回结果,也没返回成功或是失败,就是一直卡住的状态,严重影响ngi ...
- ResNet——Deep Residual Learning for Image Recognition
1. 摘要 更深的神经网络通常更难训练,作者提出了一个残差学习的框架,使得比过去深许多的的网络训连起来也很容易. 在 ImageNet 数据集上,作者设计的网络达到了 152 层,是 VGG-19 的 ...
- cmd下执行mysql
1. mysql -uroot -p1234; 2. show databases; 3. use testnode; 4. 创建数据库表 CREATE DATABASE `node` DEFA ...