单例(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. net 快速打印日志

    System.IO.File.AppendAllText(@"F:WriteText.txt", "日志内容“+"\r\n");

  2. 读书笔记:《HTML5开发手册》--figure、time、details、mark

    这是补充HTML5基础知识的系列内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四. ...

  3. ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  4. 转载Linux下开启MySQL日志

    转载https://blog.csdn.net/weixin_38187469/article/details/79273962 开启mysql日志   1.查看日志是否启用 mysql> sh ...

  5. git push失败

    不知道弄错了什么上传项目到github上失败 git commit的时候提示 On branch masternothing to commit, working tree clean git pus ...

  6. c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

    重载,隐藏(重定义),覆盖(重写)—这几个名词看着好像很像,不过其实一样都不一样!! 综述: 说明:覆盖中的访问修饰符可以不同是指可以不用显示地用virtual:当访问修饰符改为const或者stat ...

  7. MCS锁——可伸缩的自旋锁

    在编写并发同步程序的时候,如果临界区非常小,比如说只有几条或几十条指令,那么我们可以选择自旋锁(spinlock).使用普通的互斥锁会涉及到操作系统的调度,因此小临界区一般首选自旋锁.自旋锁的工作方式 ...

  8. 第七周psp例行报告

    本周psp 本周进度条 代码累积折线图 博文字数累积折线图 饼状图

  9. 对cnblogs.com的用户体验

    1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是计算机专业学生,是奔向神奇的代码世界的旅人.希望在cnblogs上找到自己感兴趣的技术,并学到更多的知识,提升自己的 ...

  10. servlet 路径问题

    首先明确绝对路径与相对路径,绝对路径:相对于盘符的路径c://a.txt,相对路径格式如/web/hello.jsp.还有一个是网络路径http://www.baidu.com/...... 一般来说 ...