C++ 设计模式之单例模式
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++ 设计模式之单例模式相关推荐
- socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》
Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...
- C#设计模式(1)——单例模式
原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
- java单例模式的七种写法_Java设计模式之单例模式的七种写法
什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...
- go设计模式之单例模式
在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...
- 一篇博客读懂设计模式之---单例模式
一篇博客读懂设计模式之---单例模式 一. 单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...
- Java 设计模式(3)单例模式
前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...
- socket可以写成单例嘛_精读设计模式 Singleton 单例模式
Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 实践GoF的设计模式:单例模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...
最新文章
- torch.load invalid load key, ‘\x00‘
- 作为阿里的面试官,我有话想说
- 5W+人的公司怎么把总部和分部网络连接起来?
- 网页浏览器知道我们的哪些信息?(1)
- 请不要对我说“你要马上把这个小问题修改好”
- [js] for in 和 for of 的区别?
- 使用手机企业微信创建自己的企业(公司)
- oracle的集函数,Oracle统计分析函数集之一(转载)
- ElasticSearch实践(三)Rest API简介
- android 宽度动画,android – ObjectAnimator对LinearLayout宽度进行动画处理
- 蓝桥杯 基础练习 01字串(水题)
- adb冲突 傲软_ubuntu下安装adb工具集与android-tools-adb产生冲突的问题
- 【POJ 3074】Sudoku【剪枝】
- 用Python写了个工具,完美破解了MySQL!!(建议收藏)
- .NET JWT Token验证
- 外卖cps分销公众号小程序淘客项目,引发的思考(附0基础搭建源码)
- Ubuntu系统搭建SU2计算环境
- Git Github 学习
- 高级宏观经济学公式整理
- pip版本更新的问题
热门文章
- 关于二轮差速小车轮速计算和里程计计算
- 30年「相爱相杀」 :30张照片回顾乔布斯和比尔盖茨之间「不得不说」的故事...
- 学报格式和论文格式一样吗_(学报论文格式.doc
- 助推建筑项目高质量建设,智慧工地用数字化赋能
- Three.js之吊炸天的3D元素周期表探究及再开发
- PHP单双引号的区别
- 八年级计算机教案word,八年级信息技术WORD2003教案.doc
- 【NOWCODER】- Python:字典(一)
- Week3:[任务三] nn网络层-池化、线性、激活函数网络层
- 都是工作好几年的网络工程师,你可千万别再这样写年终总结了