两种单例模式的区别

文章目录

      • 看两个栗子
        • 传统指针版单例模式
        • 现代静态变量版单例模式
      • 分析
      • 结论

看两个栗子

传统指针版单例模式
class Singleton {
private:// 私有化构造函数Singleton() {}// 禁止拷贝构造函数Singleton(const Singleton&) = delete;// 禁止拷贝赋值操作Singleton& operator=(const Singleton&) = delete;// 静态变量,存储唯一实例static Singleton* instance;public:// 静态方法,用于获取实例static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}// 其他成员函数void Display() {//...}
};// 在类外初始化静态成员变量
Singleton* Singleton::instance = nullptr;int main() {// 获取单例类的实例Singleton* mySingleton = Singleton::getInstance();mySingleton->Display();
}
现代静态变量版单例模式
class Singleton {
private:// 私有化构造函数Singleton() {}// 禁止拷贝构造函数Singleton(const Singleton&) = delete;// 禁止拷贝赋值操作Singleton& operator=(const Singleton&) = delete;public:// 静态方法,用于获取实例static Singleton& getInstance() {static Singleton instance;return instance;}// 其他成员函数void Display() {//...}
};int main() {// 获取单例类的实例Singleton& mySingleton = Singleton::getInstance();mySingleton.Display();
}

分析

💥两种单例模式的优劣和区别:

  1. 简洁性
  • 传统指针版:需要手动管理指针(如初始化和销毁),代码稍复杂。
  • 现代静态变量版:代码简洁,避免了指针管理。
  1. 线程安全
  • 传统指针版:在多线程环境下,手动管理静态实例的创建需要考虑线程安全问题,通常需要加入互斥锁。
  • 现代静态变量版:C++11 以后,局部静态变量的初始化是线程安全的,天然支持多线程环境。
  1. 内存管理
  • 传统指针版:需要显式删除静态实例对象,避免内存泄漏。
  • 现代静态变量版:局部静态变量由编译器自动管理其生命周期,不需要手动删除。

🎉推荐:
在大多数情况下,我更推荐使用现代静态变量版的单例模式,原因如下:

  1. 简洁明了:代码更简洁,更容易理解和维护。
  2. 线程安全:C++11 及其之后版本保证了线程安全的初始化。
  3. 自动内存管理:不需要手动管理内存,减少了内存泄漏的风险。

然而,在某些特定场景下,可能会有不同的考虑。例如,如果你需要在单例销毁时执行特殊的清理操作或需要在不支持 C++11 的编译器上编译代码,那么传统的单例模式可能会更适合。

结论

现代静态变量版的单例模式在大多数情境下都更符合当前的开发需求和标准,推荐优先采用。但在设计模式的选择上仍需根据具体需求和环境进行适当的调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然资源-各级国土空间总体规划的审查要点及流程总结

自然资源-各级国土空间总体规划的审查要点及流程总结 国土空间规划是对一定区域国土空间开发保护在空间和时间上作出的安排,包括总体规划、详细规划和相关专项规划。 国土空间规划管理是国土空间规划中重要的一环。中共中央、国务院发布《关于建立国土空间规划体系…

LabelMe下载及关键点检测数据标注

本文关键点数据集链接,提取码:x1pk 1.LabelMe下载 这部分内容和YOLOv8_seg的标注软件是一样的,使用anaconda创建虚拟环境安装LabelMe,指令如下: conda create -n labelme python=3.6 -y conda activate labelme conda install pyqt conda install pillow pip install la…

朝天椒USB服务器为何脱颖而出,与其它产品有何不同?

在数字化时代,USB服务器作为解决U盾、加密狗、Ukey等USB设备原创连接、集中管理和共享使用问题的有效工具,越来越受到各行各业的重视。在众多品牌中,朝天椒USB服务器凭借其独特的技术优势和市场定位,成功脱颖而出,成为…

python:__set_name__使用

python:__set_name__使用 1 前言 在Python中,我们可以通过__set_name__方法来实现一些特殊的操作。该方法是在定义类的时候被调用,用于设置属性的名称。这样一来,我们就可以在类定义中动态地获取属性的名称,从而更好…

Pytorch深度学习实践笔记6(b站刘二大人)

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

C#记录日志

1、方法 private void Log(string LogStr) { //Trace.WriteLine(LogStr); StreamWriter sw null; try { LogStr DateTime.Now.ToLocalTime().ToString() "\n" LogStr; sw new StreamWriter("C:\\Text" DateTime.No…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十)- JUC(6)

目录 wait , notify wait vs sleep 正确使用方法 同步保护性暂停 join的源码 Future 异步生产者/消费者模型 定义 Park & Unpark 原理 wait , notify 小故事小南需要烟才能工作,但它又要占这锁让别人无法进来。那么这个时候开一个waitSet相当于就是休…

一文讲解——Java多态

目录 一、什么是多态?二、转型向上转型向下转型 三、方法覆盖与方法重载四、绑定动态绑定静态绑定 五、理解多态 一、什么是多态? 多态的词组字面意思是: 某种事物多种形态。 但是对于我们学习Java 的程序原来说,就不不能简单这样…

springboot中线程池的使用

一、概念 线程池就是将多个线程对象放入一个池子里面,例如一个池塘,线程池就是这个池塘,池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程,在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…

2024年内外贸一体化融合发展(长沙)交易会 ​办公文具、礼品工艺品展

2024年内外贸一体化融合发展(长沙)交易会 办公文具、礼品工艺品展 时间:2024年7月12-14日 地点:湖南国际会展中心(芒果馆) 湖南省商厅 关于邀请参加2024内外贸一体化融合发展(长沙&#xf…

Weblogic XML反序列化漏洞 [CVE-2017-10271]

漏洞环境搭建请参考 http://t.csdnimg.cn/i11e2 漏洞原理 Weblogic的wls security组件对外提供webservice服务,wls security组件使用了xmldecoder来解析用户传入的xml数据,如果用户进行xml恶意数据的构造,即可触发反序列化漏洞 漏洞版本 O…

簡述vue的實現原理

Vue.js 的实现原理可以概括为以下几个方面: 响应式系统: Vue 的核心是其响应式系统。当 Vue 实例被创建时,它会遍历 data 对象中的所有属性,并使用 Object.defineProperty 方法将其转换为 getter 和 setter。当 data 中的属性发生…

python:如何创建简单的流媒体服务器来播放.flv文件

要在Python中创建一个简单的流媒体服务器来播放FLV(Flash Video)文件,你通常需要一个HTTP服务器,该服务器能够处理对FLV文件的范围请求(Range Requests),因为流媒体通常不是一次性下载整个文件&…

CentOS 7.9 邮箱部署——Postfix+Dovecot详细

PostfixDovecot 文章目录 PostfixDovecot资源列表基础环境一、部署DNS二、部署postfix和dovecot2.1、配置postfix2.2、配置dovecot2.3、创建邮件用户 三、发送邮件测试3.1、windows安装poxmail3.2、登录邮箱3.3、发送接收邮件 四、搭建SSL认证加密4.1、生成私钥4.2、生成公钥4.…

正则工具类

目录 1、 * 正则工具类 1.1、 * 提供验证邮箱、手机号、电话号码、身份证号码、数字等方法 1.1.1、 * 验证固定电话号码 1.1.2、 * 验证整数(正整数和负整数) 1.1.3、 * 验证整数和浮点数(正负整数和正负浮点数)

贪心算法4(c++)

过河的最短时间 题目描述 输入 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过,如果…

YOLOv8_pose预测流程-原理解析[关键点检测理论篇]

YOLOv8_seg的网络结构图在博客YOLOv8网络结构介绍_CSDN博客已经更新了,由网络结构图可以看到相对于目标检测网络,实例分割网络只是在Head层不相同,如下图所示,在每个特征层中增加了KeyPoint分支(浅绿色),通过两个卷积组和一个Conv卷积得到得到通道数为51的特征图,51表示…

window环境下QT5开发环境的搭建

1、安装visual Stusio 15 生成工具2012 2、安装Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安装完成之后, 修改:选择桌面调试,如下: 4、打开QTcreator,选项中,配置编译器&#xff…

摸鱼大数据——Hive基础理论知识——Hive环境准备

Hive环境准备 1、shell脚本执行方式 方式1: sh 脚本 注意: 需要进入脚本所在目录,但脚本有没有执行权限不影响执行 方式2: ./脚本 注意: 需要进入脚本所在目录,且脚本必须有执行权限 方式3: /绝对路径/脚本 注意: 不需要进入脚本所在目录,但必须有执行…

线程池,日志

所要用到的知识点: 多线程的创建 生产消费模型, 线程锁 条件变量 代码: 线程池日志