单例(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++模式学习------单例模式的更多相关文章

  1. .NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证

    .NET责任链模式.单例模式.模板方法模式混用 前言 哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器.我们团队的成员 ...

  2. Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

    Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...

  3. State模式学习笔记

    选用了一个假设需要用户验证的例子进行State模式学习,这个例子并不恰当.无所谓了,只要能学习到其中的内容即可. 适用性: 1,一个对象的行为取决于他的状态,并且它必须在运行时刻依据状态改变他的行为. ...

  4. SQL反模式学习笔记1 开篇

    什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...

  5. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  6. SQL反模式学习笔记3 单纯的树

    2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...

  7. SQL反模式学习笔记2 乱穿马路

    程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标:  存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...

  8. SQL反模式学习笔记4 建立主键规范【需要ID】

    目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...

  9. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

随机推荐

  1. Python的requests、greenlet和gevent模块在windows下安装

    一.requests模块在windows下安装 Linux系统下requests的安装方法在http://docs.python-requests.org/en/latest/user/install ...

  2. unity灯光烘焙设置详解

    游戏场景中灯光照明的构成 现实生活中的光线是有反射.折射.衍射等特性的.对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向. 在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效 ...

  3. RabbitMQ入门:发布/订阅(Publish/Subscribe)

    在前面的两篇博客中 RabbitMQ入门:Hello RabbitMQ 代码实例 RabbitMQ入门:工作队列(Work Queue) 遇到的实例都是一个消息只发送给一个消费者(工作者),他们的消息 ...

  4. 如何推行Code Review

    这篇文章探讨的是如何在一个没有Code Review习惯的团队里面Code Review. 在进行Code Review的时候,审核人很多时候会对被审核人的代码指手画脚,在评价对方的代码,甚至是在批评 ...

  5. WebRTC入门

    什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器.乙和服务器之间建立信道.甲给乙发 ...

  6. impala 使用记录

    在命令行里面直接输入类似下面的语句,就可以执行impala sql语句. impala-shell -q "select * from xxxc limit 10;" 当用pyth ...

  7. mpstat命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858775.html 简介 mpstat是Multipro ...

  8. WinForm中从SQLite数据库获取数据显示到DataGridView

    1.关于Sqlite Sqlite是一款开源的.适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL. 不像SqlServer或Oracle的引擎是一个独立的进程.通过TCP或命名管道等与程 ...

  9. [shell] bash数组(for时排序)

    for处理时会自动把顺序按A-Z排序了 [root@XM-v106 ~]# bash b.sh A -> B -> C -> D -> E -> [root@XM-v10 ...

  10. yarn资源memory与core计算配置

    yarn调度分配主要是针对Memory与CPU进行管理分配,并将其组合抽象成container来管理计算使用 memory配置 计算每台机子最多可以拥有多少个container:  container ...