C++ 设计模式之单例模式

  • 饿汉模式
  • 懒汉模式
  • Meyers 单例模式

单例模式:类只有一个实例,并且全局可访问。

单例模式又分为饿汉模式和懒汉模式。

饿汉模式

饿汉模式是指类在加载时候就创建单例的对象。

// singleton.h
#ifndef __SINGLETON_H__
#define __SINGLETON_H__class Singleton {public:static Singleton* getInstance() {return instance;}   private:static Singleton* instance;
};
#endif// singleton.cpp
#include "singleton.h"
Singleton* Singleton::instance = new Singleton();

懒汉模式

懒汉模式是指在使用时候才创建单例的对象。获取实例的时候先判断实例是否为空,为空则创建实例并返回这个实例,否则返回已创建的实例。

// singleton.h
#ifndef __SINGLETON_H__
#define __SINGLETON_H__class Singleton {public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}private:static Singleton* instance;
};
#endif// singleton.cpp
#include "singleton.h"
Singleton* Singleton::instance = new Singleton();

加锁的饿汉模式

了解多线程安全的同学很容易看出上述代码的问题:如果多个线程同时进入 getInstance() 时候,实例都为空的话,则各自都会创建实例。很容易想到的一个方法就是加锁保证线程安全。

// singleton.h
#ifndef __SINGLETON_H__
#define __SINGLETON_H__
#include <mutex>class Singleton {public:static Singleton* getInstance() {if (instance == nullptr) {m_mutex.lock();if (instance == nullptr) {instance = new Singleton();}m_mutex.unlock();}return instance;}private:static Singleton* instance;static std::mutex m_mutex;
};
#endif// singleton.cpp
#include "singleton.h"
Singleton* Singleton::instance = new Singleton();
std::mutex Singleton::m_mutex;

Meyers 单例模式

C++11 规定了 local static 在多线程条件下的初始化行为,要求编译器保证内部静态变量的线程安全性。

#ifndef __SINGLETON_H__
#define __SINGLETON_H__
#include <iostream>class Singleton {private:Singleton () {std::cout << "Singleton ()" << std::endl;}public:static Singleton& getInstance() {static Singleton instance;return instance;}
};
#endif

可以测试如下:

 #include "singleton.h"#include <iostream>#include <thread>int main() {for (int i = 0; i < 10; ++i) {std::thread([]() {std::cout << &Singleton::getInstance() << std::endl;}).join();}   std::cout << &Singleton::getInstance() << std::endl;}

输出如下:

Singleton ()
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153
0x5588c5412153

此外,拷贝构造函数和拷贝赋值操作可以使用 delete 标记来阻止编译器自动生成。

参考:

  • 《大话设计模式》
  • https://www.yuque.com/tomocat/txc11h/dq5xse

C++ 设计模式之单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  10. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

最新文章

  1. torch.load invalid load key, ‘\x00‘
  2. 作为阿里的面试官,我有话想说
  3. 5W+人的公司怎么把总部和分部网络连接起来?
  4. 网页浏览器知道我们的哪些信息?(1)
  5. 请不要对我说“你要马上把这个小问题修改好”
  6. [js] for in 和 for of 的区别?
  7. 使用手机企业微信创建自己的企业(公司)
  8. oracle的集函数,Oracle统计分析函数集之一(转载)
  9. ElasticSearch实践(三)Rest API简介
  10. android 宽度动画,android – ObjectAnimator对LinearLayout宽度进行动画处理
  11. 蓝桥杯 基础练习 01字串(水题)
  12. adb冲突 傲软_ubuntu下安装adb工具集与android-tools-adb产生冲突的问题
  13. 【POJ 3074】Sudoku【剪枝】
  14. 用Python写了个工具,完美破解了MySQL!!(建议收藏)
  15. .NET JWT Token验证
  16. 外卖cps分销公众号小程序淘客项目,引发的思考(附0基础搭建源码)
  17. Ubuntu系统搭建SU2计算环境
  18. Git Github 学习
  19. 高级宏观经济学公式整理
  20. pip版本更新的问题

热门文章

  1. 关于二轮差速小车轮速计算和里程计计算
  2. 30年「相爱相杀」 :30张照片回顾乔布斯和比尔盖茨之间「不得不说」的故事...
  3. 学报格式和论文格式一样吗_(学报论文格式.doc
  4. 助推建筑项目高质量建设,智慧工地用数字化赋能
  5. Three.js之吊炸天的3D元素周期表探究及再开发
  6. PHP单双引号的区别
  7. 八年级计算机教案word,八年级信息技术WORD2003教案.doc
  8. 【NOWCODER】- Python:字典(一)
  9. Week3:[任务三] nn网络层-池化、线性、激活函数网络层
  10. 都是工作好几年的网络工程师,你可千万别再这样写年终总结了