QT之单例模式

一.概述

1.什么是单例模式

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以访问该实例。

在应用程序的整个生命周期内,只能创建一个特定类的对象。

单例模式常用于需要共享资源或控制共享某些资源的情况,以确保资源的一致性和有效管理。

例如一般一个程序中只有一个日志输出实例,一个系统中只有一个数据库连接实例,这时候用单例模式非常合适。

2.单例模式通常包括要素

私有构造函数:单例类通常将其构造函数设为私有,以防止外部代码直接实例化类的对象。

静态成员变量:单例类通常包含一个私有的静态成员变量,用于存储类的唯一实例。

静态成员函数:单例类通常包含一个公共的静态成员函数,通常命名为 getInstance() 或 Instance(),用于获取单例类的实例。

              说明:用getInstance或者Instance没有区别,但从直观理解上用getInstance更好一点

延迟初始化:在首次调用 getInstance() 方法时才创建类的唯一实例,以延迟初始化。

线程安全性:如果在多线程环境中使用单例模式,需要确保线程安全性,以防止多个线程同时创建实例。通常可以使用互斥锁等机制来实现线程安全性。

3.单例模式的点和缺点

优点:

提供全局访问点,方便在应用程序的不同部分共享对象。

确保只有一个实例存在,节省资源。

提供对单一资源或配置的集中管理。

支持懒加载,只在需要时创建实例。

缺点:

可能导致全局状态,增加了代码的耦合性。

在某些情况下可能会引入单点故障。

难以进行单元测试,因为单例对象难以模拟或替代。

二.代码实现

1.简单的单例实现

(1)test.h

#ifndef MYWIDGET_H

#define MYWIDGET_H

#include <QWidget>

#include <QString>

class MyWidget : public QWidget {

    Q_OBJECT

public:

    static MyWidget* getInstance();    

    void updateData(const QString& data);

private:

    MyWidget(QWidget* parent = nullptr);

    static MyWidget* instance;

};

#endif // MYWIDGET_H

(2)test.cpp

#include "test.h"

#include <QDebug>

MyWidget* MyWidget::instance = nullptr;

MyWidget* MyWidget::getInstance() {

    if (!instance) {

        instance = new MyWidget();

    }

    return instance;

}

MyWidget::MyWidget(QWidget* parent) : QWidget(parent) {

    // 初始化界面部件

}

void MyWidget::updateData(const QString& data)

{

    qDebug()<<"display:"<<data;

}

(3)调用

   #include "test.h"

   MyWidget* myWidget = MyWidget::getInstance();

   myWidget->updateData("Some data to display");

   //或者

  MyWidget::getInstance()->updateData("Some data to display");  

  

2.线程安全的单例示例

(1)test.h

#ifndef MYWIDGET_H

#define MYWIDGET_H

#include <QWidget>

#include <QString>

class MyWidget : public QWidget {

    Q_OBJECT

public:

    static MyWidget* getInstance();

    void updateData(const QString& data);

private:

    MyWidget(QWidget* parent = nullptr);

    static QScopedPointer<MyWidget> self;

};

#endif // MYWIDGET_H

(2)test.cpp

#include "test.h"

#include <QDebug>

#include "qmutex.h"

QScopedPointer<MyWidget> MyWidget::self;

MyWidget *MyWidget::getInstance()

{

    if (self.isNull()) {

        static QMutex mutex;

        QMutexLocker locker(&mutex);

        if (self.isNull()) {

            self.reset(new MyWidget);

        }

    }

    return self.data();

}

MyWidget::MyWidget(QWidget* parent) : QWidget(parent) {

    // 初始化界面部件

}

void MyWidget::updateData(const QString& data)

{

    qDebug()<<"display:"<<data;

}

(3)调用

#include "test.h"

MyWidget::getInstance()->updateData("Some data to display");

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

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

相关文章

C#实现只保存2天的日志文件

文章目录 业务需求代码运行效果 欢迎讨论&#xff01; 业务需求 在生产环境中&#xff0c;控制台窗口不便展示出来。 为了在生产环境中&#xff0c;完整记录控制台应用的输出&#xff0c;选择将其输出到文件中。 但是&#xff0c;存储所有输出的话会占用很多空间&#xff0c;…

uniApp使用uview对vuex的二次封装实现全局变量

1、uni-app目根目录新建’/store/index.js’&#xff0c;并复制如下内容到其中 2、uni-app目根目录新建’/store/ u . m i x i n . j s ′ &#xff0c;并复制如下内容到其中&#xff0c;由于 H X 某些版本的限制&#xff0c;我们无法帮您自动引入 " u.mixin.js&#xff0…

element-ui card 组件源码分享

今日简单分享 card 组件源码&#xff0c;主要从以下两个方面&#xff1a; 一、card 组件页面结构 二、card 组件属性 2.1 header 属性&#xff0c;设置 header&#xff0c;也可以通过 slot#header 传入 DOM&#xff0c;类型 string&#xff0c;无默认值。 组件使用部分&#…

【Kotlin】匿名类和伴生类

1 匿名类 1&#xff09;无继承 fun main() {var obj object {var name: String "zhang"override fun toString(): String {return name}}println(obj) // zhang } 2&#xff09;有继承 fun main() {var obj object: People {var name: String "zhang"…

Linux TUN设备实现Tunnel性能分析

一、TUN/TAP设备原理&#xff1a; Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块&#xff0c;通常用于组建虚拟局域网中的点对点隧道&#xff08;Tunnel&#xff09;&#xff0c;可以工作于2层&#xff08;TAP设备&#xff09;和3层&#xff08;TUN设备…

Linux的软链接和硬链接

1、软链接 概念&#xff1a;给文件创建一个快捷方式&#xff0c;依赖原文件&#xff0c;和普通文件没有区别。 特性&#xff1a; 可以给存在的文件或目录创建软链接可以给不存在的文件或目录创建软链接可以跨文件系统创建软链接删除软链接不影响原文件、删除原文件会导致软链…

moment.js 产出未知格式的时间,可能的原因

moment.js 产出未知格式的时间&#xff0c;可能的原因 有个问题困扰我好久了&#xff0c;在项目中使用格式化时间的时候会产出一些千奇百怪的格式&#xff0c;产出的文字我都不认识。 百思不得其解&#xff0c;终于今天在看代码的时候发现了这个问题。 它的表现是这样的&…

kafka与rabbit 介绍,区别,优缺点以及Java配置示例

Apache Kafka 和 RabbitMQ 是两种广泛使用的消息中间件&#xff0c;它们都可以实现高效的消息传递&#xff0c;但它们有着不同的设计理念、使用场景和特性。 Apache Kafka&#xff1a; Apache Kafka 是一个分布式、高吞吐量的发布订阅消息系统&#xff0c;主要应用于大数据实时…

详细介绍如何利用 A star(A*)算法解决8数码问题

文章目录 1. A star(A*)算法简介2. 利用A*解决8数码问题(含Python代码)2.1 什么是8数码问题2.2 A*算法中的开放列表和关闭列表2.3 A*算法解决8数码问题过程2.3.1 计算节点(棋盘顺序)间距离2.3.2 交换数字生成新的节点2.3.3 A*主求解程序1. A star(A*)算法简介 A ∗ A^*…

算法之模拟

前言 模拟算法通俗地来解释就是 "照葫芦画瓢", 通常这类题的题目中就说明了这道题应该怎么做, 要做的就是把题目的意思转化为代码, 这类题的特点是思路比较简单, 考查的是代码能力. 1. 模拟算法流程, 最好在演草纸上过一遍流程, 凭空想象可能会忽略一些细节 2. 把流…

Vue3:组件间通信-$refs和$parent的使用

一、情景说明 我们在之前&#xff0c;学习了Vue3&#xff1a;标签的ref属性用法 我们知道&#xff0c;父组件中&#xff0c;给子组件使用ref标记后&#xff0c;获取到的是&#xff0c;子组件实例。 那么&#xff0c;我们就可以修改子组件实例暴露的变量值。 与之对应的是&…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

比较靠谱的测试进度报告

在测试的过程中&#xff0c;不要等领导过问&#xff0c;有一份比较靠谱的测试进度报告&#xff0c;让关心和支持项目的干系人心里有谱&#xff0c;有利于管理层对项目的监控和资源的支持&#xff0c;有利于项目团队成员之间沟通协调&#xff0c;及时发现问题利于项目风险控制等…

八字合盘 api数据接口

八字合盘可以双方的生辰八字来以本命卦&#xff0c;年支同气&#xff0c;月令合&#xff0c;日干合&#xff0c;天干五合&#xff0c;合盘论吉凶&#xff0c;并给出相应分数&#xff0c;测算结果仅供参考。 接口名称&#xff1a;八字-八字合盘 接口平台&#xff1a;缘份居国学…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

【C++11】异常机制

文章目录 一. 什么是异常&#xff1f;二. 为什么要引入抛异常机制&#xff1f;方法一&#xff1a;直接终止程序方法二&#xff1a;返回错误码方法三&#xff1a;C 标准库中的 setjmp 和 longjmp 组合总结 C 中处理异常的方式 三. 如何进行抛异常&#xff1f;1. 关于抛出的异常对…

前端性能监控、异常监控的一些记录

文章目录 常见异常类型常用的一些异常监控的方法window.errorwindow.addEventListener(error)window.addEventListener(load)window.addEventListener(DOMContentLoaded)window.performancenavigator.sendBeacon1*1像素gifaxios 请求/响应拦截器Vue的errorHandlerReact的ErrorB…

C#网站系统如何监控登录过期

原理 网站系统监控登录过期通常涉及多个层面的技术和策略。以下是一些建议的方法来实现这一功能&#xff1a; 会话管理 会话超时设置 为每个用户会话设置一个超时时间。一旦用户在这个时间段内没有与系统进行任何交互&#xff0c;会话将被视为过期&#xff0c;用户需要重新…

[QOpenGLWidget+QMouseEvent]实时绘制长方形

复现moho-打卡第1天 - 20240402 1.1--QOpenGLWidget中显示长方形 实现方法&#xff1a;顶点着色器中给定长方形的四个顶点数据&#xff0c;代码如下&#xff1a; // 顶点位置 GLfloat vertics[1][4][3] { {{mousePressPosX,mousePressPosY,0.0},{mousePressPosX,mouseMoveP…