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

Qt:实现单例模式

前言

记录一下。

正文

单例模式根据实现方式和应用场景在Qt中可以分为以下几种类型:

1. 懒汉式单例

懒汉式单例在第一次使用时才创建实例,延迟了对象的初始化。懒汉式单例分为线程安全和线程不安全两种实现方式。

  • 线程不安全的懒汉式单例

    • 在第一次调用 getInstance() 时创建实例,未实现线程安全保护,多线程情况下可能导致多个实例被创建。
  • 线程安全的懒汉式单例(最常用)

    • 在第一次调用时创建实例,使用锁机制确保在多线程环境中只创建一个实例。

优点:实例不会过早创建,节省内存。
缺点:在多线程环境下需要额外处理线程安全问题,可能影响性能。

2. 饿汉式单例

饿汉式单例在程序启动时就创建实例,实例的生命周期与程序相同。

  • 实例在类加载时就创建,适合频繁使用的场景。
  • 饿汉式单例的线程安全是由于其在类加载时由编译器自动处理,不需要额外的锁机制。

优点:简单直接,线程安全,适合在启动时需要立即使用的场景。
缺点:无论是否使用该实例,程序启动时就会创建,可能浪费资源。

3. 静态局部变量单例(最简单)

C++11 标准引入了线程安全的静态局部变量初始化机制,可以用于简化单例的实现。在这种方法下不需要显示的管理内存。

  • getInstance() 方法中,使用一个静态局部变量来保存单例对象。C++11 保证了静态局部变量的线程安全初始化。

优点:简单且线程安全,不需要显式加锁。
缺点:C++11 及以上标准才支持。

4. 使用 Qt 的 Q_GLOBAL_STATIC

这是 Qt 提供的一个特殊实现,通过 Q_GLOBAL_STATIC 宏创建一个全局静态对象,自动管理线程安全性。

优点:适合 Qt 程序,线程安全,简化了实现逻辑。
缺点:只能用于 Qt 环境中。

实现

具体实现参考我的其它文章
Qt:懒汉单例(附带单例使用和内存管理)
Qt:饿汉单例(附带单例使用和内存管理)
Qt:静态局部变量实现单例(附带单例使用和内存管理)
Qt:Q_GLOBAL_STATIC实现单例(附带单例使用和内存管理)

小结

如有错误请指正。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 1.1 计算机网络基本概述
  • #if等命令的学习
  • 【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化
  • 【Linux】Image、zImage与uImage的区别
  • 【蜡笔小新专享】安装虚拟机、PHP、DVWA
  • 三只羊的麻烦,轮到抖音了…
  • OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
  • Android Studio Menu制作
  • GPIO子系统
  • leetcode49字母异位词分组
  • 一.Oracle每日运维操作
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • Html在线编辑器
  • Markdown formula 公式
  • 【C#生态园】完整解读C#音频处理库:功能、安装配置和使用场景一网打尽
  • [PHP内核探索]PHP中的哈希表
  • hexo+github搭建个人博客
  • (三)从jvm层面了解线程的启动和停止
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Leetcode 27 Remove Element
  • PaddlePaddle-GitHub的正确打开姿势
  • Python语法速览与机器学习开发环境搭建
  • React+TypeScript入门
  • 编写符合Python风格的对象
  • 基于webpack 的 vue 多页架构
  • 今年的LC3大会没了?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 设计模式走一遍---观察者模式
  • 时间复杂度与空间复杂度分析
  • 实现简单的正则表达式引擎
  • 项目实战-Api的解决方案
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (04)odoo视图操作
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (pytorch进阶之路)扩散概率模型
  • (Ruby)Ubuntu12.04安装Rails环境
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)c52学习之旅-独立按键
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)opengl函数加载和错误处理
  • (算法)N皇后问题
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (五)Python 垃圾回收机制
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 物件導向與老子思想 (OO)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Net 8.0 新的变化
  • .NET Micro Framework初体验(二)