首页 > 其他分享 >Qt:实现单例模式

Qt:实现单例模式

时间:2024-09-17 13:55:08浏览次数:10  
标签: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实现单例(附带单例使用和内存管理)

小结

如有错误请指正。

标签:Qt,创建,模式,实例,线程,单例,懒汉
From: https://blog.csdn.net/m0_71489826/article/details/142282843

相关文章

  • 【理论篇】数据挖掘 第六章 挖掘频繁模式、关联和相关性:基本概念和方法(下)
    说明:文章为《数据挖掘:概念与技术原书第03版》的学习笔记,该书是数据挖掘领域的经典之作,想了解更多内容请参阅原著。首先祝大家中秋快乐,本文章接上篇【理论篇】数据挖掘第六章挖掘频繁模式、关联和相关性:基本概念和方法(上)思考:满足最小支持度和最小置信度的模式一定是有趣......
  • Qt Metadata
    1.codeclassGranPa:publicQObject{Q_OBJECTpublic:explicitGranPa(QObject*parent=nullptr);signals:voidgran_siga();voidgran_sigb();voidgran_sigc();publicslots:voidgran_slota();voidgran_slotb();voidgran_slotc();};GranPa::GranPa(QOb......
  • LVS三种负载均衡模式的比较
    文章目录三种模式对比三种模式对比LVS-NATLVS-DRLVS-TUN服务器操作系统可以使用任何支持TCP/IP的操作系统大多数常见的操作系统都可以使用需要支持IP隧道技术的操作系统服务器网络需要私有网络,所有真实服务器(RS)必须位于同一局域网内同样需要局域网,但RS可以使用公网......
  • redis哨兵模式和集群模式
    ###哨兵模式 想象一下你有一家便利店,这个便利店就是你的Redis服务器。为了确保便利店能一直营业,你需要有人来监督这家店是否正常运作。这就是哨兵模式的基本思想。 -**哨兵(Sentinel)**:哨兵就像是便利店的保安,它们的任务是监视便利店是否正常开门营业(也就是监视Redis服务......
  • 快速入门 QT5 C++基础
    1.QT5中文显示乱码方法一:system("chcp65001");//放在主函数中方法二:首先引入库  #include"windows.h"再在主函数中写 SetConsoleOutputCP(CP_UTF8);2.什么是类,如何创建一个类#include<iostream>#include"windows.h"usingnamespacestd;classDog{/......
  • Js继承之圣杯模式
    圣杯模式圣杯模式的核心就是拿一个空的构造函数去当中间人,解决组合模式的缺陷。举个例子functionPerson(name,age){this.name=name??"";this.age=age??"";};Person.prototype.say=function(){console.log(this.name+'----'+this.age)}......
  • 微信小程序的多级选择器(multiSelector模式的Picker)如何设计出各列之间的可选项有关联
    在微信小程序中,我们常常会需要使用到选择器(Picker),而选择器有一种模式叫做multiSelector,即多级选择。这个选择器可用于提交多个维度的信息,例如在餐厅里点餐时,需要同时提交要点的蔬菜、荤菜、主食、汤的信息。关于选择器,使用的方法见picker|微信开放文档。这里简单说明一下多......
  • WSL2+Ubuntu 22.04搭建Qt开发环境+中文输入法
    WSL2+Ubuntu22.04搭建Qt开发环境+中文输入法安装wsl略wsl更新wsl--updatewsl--versionwsl--status我的显示如下,如果你的版本不是wsl2需要改为wsl2:$wsl--update正在安装:适用于Linux的Windows子系统已安装适用于Linux的Windows子系统。$wsl......
  • 重生之我在Java世界------学单例设计模式
    什么是单例设计模式?单例模式是面向对象编程中最简单却又最常用的设计模式之一。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的原理、常见实现方法、优缺点,以及在使用过程中可能遇到的陷阱。单例模式的核心原理单例模式的实现主要......
  • Yolov5水果分类识别+pyqt交互式界面
    Yolov5FruitsDetectorYolov5是一种先进的目标检测算法,可以应用于水果分类识别任务。结合PyQT框架,可以创建一个交互式界面,使用户能够方便地上传图片并获取水果分类结果。以下将详细阐述Yolov5水果分类识别和PyQT交互式界面的实现。Yolov5是由Ultralytics公司开......