当前位置: 首页 > article >正文

设计模式 -- 单例模式

设计模式 -- 单例模式

  • 单例模式
  • C++ 实现
    • 饿汉式单例模式
    • 懒汉式单例模式
      • 使用静态局部变量实现懒汉式单例模式(推荐)
      • 使用call_once实现懒汉式单例模式(推荐)
      • 使用静态全局部变量和指针的方式实现懒汉式单例模式(不推荐)
      • 双重检测懒汉式单例模式

单例模式

  • 单例模式:确保在整个程序运行期间只有一个类的实例存在,并提供全局访问点。常用于只需要创建一次的对象(如:数据库连接、日志记录器或配置管理器)
    优点:全局唯一实例入口,简化其他模块获取该服务的复杂度;只有一个实例,整个应用程序生命周期中实例始终可用,减少重复创建对象,避免资源浪费等
    缺点:全局可见,增加了系统的耦合性;全局唯一,单元测试会变得困难,尤其是当涉及到复杂的业务逻辑时;添加新功能时,需要修改现有代码的单例实现,不符合开闭原则等
  • 单例模式实现由两种方式:饿汉式单例模式和懒汉式单例模式
  • 两种方式的实例化时机不同,饿汉式单例在程序启动时(或在任何静态初始化发生时)就创建了实例,而懒汉式单例则延迟到实际需要时才创建实例
    在这里插入图片描述

C++ 实现

饿汉式单例模式

  • 在main函数之前或动态库加载之前就完成了单例的创建,使用时不需要再创建对象,因此是线程安全的
  • 缺点:在程序启动时就已经存在,因此它可能在某些情况下导致不必要的资源使用,特别是创建成本较高且程序在大部分运行时间内都不需要它时。在这些情况下,懒汉式单例模式可能是一个更好的选择
#include <iostream>
class Singleton
{
   
public:
	static Singleton& getInstance() {
    return instance; }
	void PrintLog() {
    std::cout << "CHungryMode " << std::endl; };
public:
	// 禁止拷贝、移动和赋值
	Singleton(const  Singleton& mode) = delete;
	Singleton(Singleton&& mode) = delete;
	Singleton& operator=(const  Singleton& mode) = delete;
private:
	Singleton() {
   };
	~Singleton() {
   };
private:
	static  Singleton instance;          //静态成员变量
};
Singleton  Singleton::instance;  // 定义静态成员变量(通常放在源文件中,而不是头文件中)

int main()
{
   
	Singleton::getInstance().PrintLog();
    system("pause");
}

懒汉式单例模式

  • 在C++11标准后的版本,可以直接使用静态局部变量、call_once 实现懒汉式单例模式
  • 在C++11标准前的版本或者使用指针的方式实现单例模式时,需要考虑多线程问题

使用静态局部变量实现懒汉式单例模式(推荐)

  • C++11及以后续标准,使用static局部变量来实现单例模式的懒汉式是一种线程安全且高效的方法
  • 利用了C++11中局部静态变量初始化的线程安全性保证,无需额外的同步机制。当局部静态变量第一次被访问时,它会在一个线程安全的上下文中被初始化,并且只会被初始化一次
  • 但使用C++11之前版本或者使用指针的方式实现单例模式时,需要考虑多线程问题 [静态变量]
#include <iostream>
class Singleton
{
   
public:
	static Singleton

http://www.kler.cn/a/448532.html

相关文章:

  • Vue(二)
  • 【ETCD】【源码阅读】深入分析 storeTxnWrite.Put方法源码
  • 软件需求建模方法
  • 内网IP段介绍与汇总
  • STM32 高级 物联网通信之CAN通讯
  • Java模拟多个Mqtt客户端连接Mqtt Broker
  • en3d 部署笔记
  • leetcode刷题日记03——javascript
  • Excel设置生日自动智能提醒,公式可直接套用!
  • 如何使用 TypeScript 和 Jest 编写高质量单元测试
  • Y3编辑器教程6:触发器进阶案例
  • 本地高精度OCR!由GPT-4o-mini驱动的开源OCR!
  • 【C++】哈希表实现
  • ‌Elasticsearch(es)自定义分词器,根据特殊符号分词或分词后保留特殊符号
  • 计算机基础知识——数据结构与算法(五)(山东省大数据职称考试)
  • Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
  • python学opencv|读取图像(十八)使用cv2.line创造线段
  • js导出Excel(图片大小,数据转换,导出后面添加现在的时间 )
  • Vue的响应式基础
  • Go 语言并发实战:利用协程处理多个接口进行数据融合
  • 常耀斌:深度学习和大模型原理与实战(深度好文)
  • 【漫话机器学习系列】012.深度学习(Deep Learning)基础
  • Webpack的打包过程/打包原理/构建流程?
  • Unity Shader学习日记 part 1 基础知识
  • 广义正态分布优化算法(GNDO)Generalized Normal Distribution Optimization
  • LeetCode 力扣 热题 100道(二十)三数之和(C++)