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

两种单例模式的区别

文章目录

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

看两个栗子

传统指针版单例模式
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 的编译器上编译代码,那么传统的单例模式可能会更适合。

结论

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【简明指南:Python中的异常处理与稳健代码设计】
  • 限流及限流算法
  • powershell脚本批量拉取 git仓库文件
  • 老外卖27刀每月的教程已经更新
  • c# sqlite使用
  • vue2 自定义指令
  • OpenAI模型GPT-4o、GPT-4、Gemini 1.5性能比较
  • R实验 方差分析
  • 【运维项目经历|024】MySQL性能优化与监控平台
  • 神奇动物在哪里?斯洛文尼亚旅游之野生动物寻踪
  • 2024年郫都区区级农业生产社会化服务重点服务组织评定申报条件材料、程序要求
  • Python筑基之旅-MySQL数据库(四)
  • Java+IDEA+SpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码
  • python数据分析——数据可视化(图形绘制)
  • 【BI 可视化插件】怎么做? 手把手教你实现
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular4 模板式表单用法以及验证
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Java的Interrupt与线程中断
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • MySQL主从复制读写分离及奇怪的问题
  • pdf文件如何在线转换为jpg图片
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 缓存与缓冲
  • 聊聊directory traversal attack
  • 日剧·日综资源集合(建议收藏)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用 QuickBI 搭建酷炫可视化分析
  • 跳前端坑前,先看看这个!!
  • 我看到的前端
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​学习一下,什么是预包装食品?​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Redis 入门到精通(一)数据类型(4)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (4) PIVOT 和 UPIVOT 的使用
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++17) optional的使用
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (九)One-Wire总线-DS18B20
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (实战篇)如何缓存数据
  • (转)http协议
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Core 版本不支持的问题
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET WPF 抖动动画
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • /proc/interrupts 和 /proc/stat 查看中断的情况