C++开发/Qt开发:单例模式介绍与应用

单例模式是软件设计模式中最简单也是最常用的一种创建型设计模式。它的核心目标是确保一个类在整个应用程序生命周期中只有一个实例,并提供一个全局访问点。

笔者白话版理解:你创建了一个类,如果你希望这个类对象在工程中应用时只创建一次,不能多次创建,比如:TCP通信时,通信模式为一对多,只能有一个服务器,而客户端可以有多个,那么你在创建服务器类时,就可以使用单例模式,这样就可以保证工程中只会有一个服务器。

核心概念

三大要点

  1. 私有化构造函数 - 防止外部直接创建实例
  2. 私有化拷贝构造函数和赋值操作符 - 防止实例被复制
  3. 提供全局访问的静态方法 - 获取唯一的实例

主要特点

  1. 唯一实例:保证一个类只有一个实例存在

  2. 全局访问:提供统一的访问接口

  3. 延迟初始化:实例在第一次使用时才被创建

  4. 线程安全:在多线程环境下也能保证唯一性

话不多说,直接上例子

基于Qt的应用:

// LaserStabilizeWin.h文件class LaserStabilizeWin : public QWidget
{Q_OBJECT
public:static LaserStabilizeWin* instance();static void disinstance();private:explicit LaserStabilizeWin(QWidget *parent = nullptr); //私有化构造函数~LaserStabilizeWin();
};
// LaserStabilizeWin.cpp#include "LaserStabilizeWin.h"LaserStabilizeWin* LaserStabilizeWin::m_pInstance = NULL; //静态成员定义
LaserStabilizeWin *LaserStabilizeWin::instance()
{if (m_pInstance == NULL){m_pInstance = new LaserStabilizeWin(NULL);}return m_pInstance;
}void LaserStabilizeWin::disinstance()
{delete m_pInstance;m_pInstance = nullptr;
}LaserStabilizeWin::LaserStabilizeWin(QWidget *parent) : QWidget(parent)
{qDebug()<<"构造函数";
}LaserStabilizeWin::~LaserStabilizeWin()
{qDebug()<<"析构函数";
}

在纯C++开发中的应用,和上面的区别不大:

class BestSingleton {
public:static BestSingleton& getInstance() {static BestSingleton instance;return instance;}// 业务方法...private://私有化构造函数和析构函数 BestSingleton() = default;~BestSingleton() = default;BestSingleton(const BestSingleton&) = delete;BestSingleton& operator=(const BestSingleton&) = delete;
};

使用场景

  1. 资源共享:如数据库连接池、线程池

  2. 配置管理:全局配置信息

  3. 日志记录:统一的日志系统

  4. 缓存系统:全局缓存管理

  5. 设备控制:如打印机、硬件设备控制

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习设计模式《二十三》——桥接模式

一、基础概念 桥接模式的本质是【分离抽象和实现】。 桥接模式的定义&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 认识桥接模式序号认识桥接模式说明1什么是桥接通俗点说就是在不同的东西之间搭一个桥&#xff0c;让它们能够连接起来&a…

HTML+CSS:浮动详解

在HTMLCSS布局中&#xff0c;浮动&#xff08;float&#xff09; 是一种经典的布局技术&#xff0c;用于控制元素在页面中的排列方式。它最初设计用于实现文字环绕图片的效果&#xff0c;后来被广泛用于复杂布局&#xff0c;但随着Flexbox和Grid的兴起&#xff0c;其使用场景有…

PAT 1074 Reversing Linked List

题目的意思给出一个链表&#xff0c;让我们每隔K个进行一次反转&#xff0c;如果不足K个的&#xff0c;就不进行。 对于链表反转的题目&#xff0c;我第一时间想出来的是&#xff0c;原地进行逆置&#xff0c;不断的变化指针&#xff0c;但这样很麻烦&#xff0c;没有想出来&am…

python学习DAY46打卡

DAY 46 通道注意力(SE注意力) 内容&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意…

猫头虎AI分享|字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent 下载、安装、配置、部署教程

猫头虎AI分享&#xff5c;字节开源了一款具备长期记忆能力的多模态智能体&#xff1a;M3-Agent 大家好&#xff0c;我是猫头虎 &#x1f989;&#x1f42f;&#xff0c;今天给大家带来一个超硬核的开源 AI 项目分享&#xff1a;M3-Agent。这是一款由字节开源的、多模态智能体框…

应用缓存不止是Redis!——亿级流量系统架构设计系列

在当今互联网架构中&#xff0c;缓存技术犹如系统的"加速器"&#xff0c;通过将热点数据存储在高速介质中&#xff0c;显著降低数据库负载并提升响应速度。无论是CPU的L1/L2/L3缓存&#xff0c;还是分布式系统中的Redis集群&#xff0c;缓存无处不在。本文将深入探讨…

洛谷 P2834 纸币问题 3-普及-

题目背景 你是一个非常有钱的小朋友。 注意&#xff1a; 本题和《进阶篇》的对应题目&#xff0c;输入格式略有差异。 题目描述 你有 nnn 种面额互不相同的纸币&#xff0c;第 iii 种纸币的面额为 aia_iai​ 并且有无限张&#xff0c;现在你需要支付 www 的金额&#xff0c;请问…

C++常见面试题-5.数据结构

五、数据结构 5.1 线性数据结构数组和链表的区别&#xff1f;数组&#xff08;Array&#xff09;&#xff1a; 存储方式&#xff1a;连续的内存空间&#xff1b;访问方式&#xff1a;支持随机访问&#xff0c;通过索引直接访问元素&#xff0c;时间复杂度为O(1)&#xff1b;插入…

Node.js 在 Windows Server 上的离线部署方案

Node.js 在 Windows Server 上的离线部署方案 离线部署的核心是提前准备所有依赖资源&#xff08;避免在线下载&#xff09;&#xff0c;并通过本地配置完成服务搭建&#xff0c;整体分为「依赖准备」「环境配置」「项目部署」「服务注册」4个阶段。 一、提前准备离线资源&am…

18.web api 9

3.M端事件4.js插件

母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南

> 在现代智能化养殖中,母猪姿态识别是健康监测的关键技术。本文将带你从0到1构建高精度母猪姿态识别系统,准确率可达95%以上! ## 一、为什么母猪姿态识别如此重要? 母猪的行为姿态是其健康状况的重要指标: - **站立姿态**:可能表示发情期或进食需求 - **侧卧姿态**:…

Unity进阶--C#补充知识点--【Unity跨平台的原理】Mono与IL2CPP

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.跨平台基本原理 知识回顾&#xff1a; ①在之前我们已经知道了跨语言的原理是.Net体系下定义了这些语言需要遵守的工业标准CLI。因此实现了面向.Net的语言都可以被编译转化成统一规…