IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【单例模式】单例模式C/C++实现/懒汉式/饿汉式 -> 正文阅读

[C++知识库]【单例模式】单例模式C/C++实现/懒汉式/饿汉式

思路分析

在书写单例模式之前,我们需要先理解为什么需要单例模式

保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。

  • 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  • 主要解决: 一个全局使用的类频繁地创建与销毁。

  • 何时使用: 当您想控制实例数目,节省系统资源的时候。

单例模式的优点有哪些

1、单例模式节省公共资源

比如:大家都要喝水,但是没必要每人家里都打一口井是吧,通常的做法是整个村里打一个井就够了,大家都从这个井里面打水喝。

对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。

2、单例模式方便控制

就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都乱七八糟,如果想要控制日志的正确性,那么必须要对关键的代码进行上锁,只能一个一个按照顺序来写,而单例模式只有一个人来向日志里写入信息方便控制,避免了这种多人干扰的问题出现。
如何实现单例模式
根据定义,显然单例模式的要点有三个:

  • 某个类只能有一个实例;
  • 它必须自行创建这个实例;
  • 它必须自行向整个系统提供这个实例。

从具体实现角度来说:

  • 单例模式的类只提供私有的构造函数
  • 类定义中含有一个该类的静态私有对象
  • 该类提供了一个静态的公有函数用于创建或者获取它本身的静态私有对象

饿汉式

那么对于饿汉来说。他希望随时都能吃到吃的,迫切的需要吃饭,所以需要事先把饭准备好

代码实现

class Singleton
{
public:
	static Singleton* getInstance ()
	{
		return &_instance;
	}
private:
	static Singleton _instance;
	Singleton() {};
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
};
Singleton Singleton::_instance;

懒汉式

根据上面的原理,我们可以猜测懒汉模式就是因为这个人很懒,所以他都是等到自己很饿了之后,才会去做饭,因此我们饿汉模式就是只有当你打算使用时,我们才会进行创建实例。

  • 优点:第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制
  • 缺点:使用不比饿汉式流畅,实现复杂,需要自己实现线程安全

代码实现流程: 构造函数私有化,将拷贝构造和赋值运算符重载设置为删除函数,成员属性有两个,分别是静态的互斥锁和一个静态的该类指针,这个指针初始化为空。然后再类中定义静态的一个获取对象的函数。在该函数中需要双重检测,第一个检测是优化代码性能,让线程不要每次都需要加锁判断,第二个检测是用于保证对象只被创建一次,该操作需要被加锁保护。

class Singleton
{
public:
	static Singleton* getInstance ()
	{
		//假如已经被创建过了,后面的线程拿到之后,先判断是否为空,如果不为空则直接返回
		if (_instance == nullptr)
		{
			_mutex.lock();
			//有线程拿到后,先进行加锁,如果为空进行创建,如果不为空,则解锁返回
			if (_instance == nullptr)
				_instance = new Singleton();
			_mutex.unlock();
		}

	}
private:
	Singleton() {};
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
	
	static Singleton* _instance;
	static mutex _mutex;
};
Singleton* Singleton::_instance = nullptr;
mutex Singleton::_mutex;
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 11:59:07  更:2021-08-11 12:05:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 6:05:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码