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

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.xdnf.cn/news/18188.html

相关文章:

  • IDEA:控制台中文乱码
  • Redis知识总结
  • 【机器学习深度学习】Ollama、vLLM、LMDeploy对比:选择适合你的 LLM 推理框架
  • MySQL高阶篇-数据库优化
  • 计算机网络模型
  • 企业通讯软件保证内部通讯安全,搭建数字安全体系
  • 建筑行业变革:用Three.js构建BIM数据可视化孪生平台
  • 代码管理平台Gitlab如何通过 ZeroNews 实现远程访问?
  • AI时代SEO关键词优化新策略
  • Redis-缓存-雪崩-持久化、集群、灾备
  • 大数据毕业设计选题推荐-基于Hadoop的电信客服数据处理与分析系统-Spark-HDFS-Pandas
  • Windows 上用 pyenv-win 玩转多版本 Python:安装、国内源、常用命令与版本切换
  • 代码随想录Day57:图论(寻宝prim算法精讲kruskal算法精讲)
  • HT6881:重塑便携式音频体验的高效能功率放大器
  • Paraformer实时语音识别中的碎碎念
  • 将SSL配置迁移到Nacos的步骤
  • HarmonyOS 中的 setInterval的基本使用
  • 分布式机器学习之流水线并行GPipe:借助数据并行来实现模型并行计算
  • 矿物分类系统开发笔记(二):模型训练[删除空缺行]
  • ZooKeeper 一致性模型解析:线性一致性与顺序一致性的平衡
  • VScode ROS文件相关配置
  • 【habitat学习一】Habitat-Lab 配置键文档详解(CONFIG_KEYS.md)
  • 嵌入式开发学习———Linux环境下网络编程学习(三)
  • RAG 面试题(实时更新补充)
  • 学习笔记分享——基于STM32的平衡车项目
  • Ubuntu 和麒麟系统创建新用户 webapp、配置密码、赋予 sudo 权限并禁用 root 的 SSH 登录的详细
  • 【PyTorch】单对象分割项目
  • 八大排序简介
  • Java 11中的Collections类详解
  • 数据结构:二叉树oj练习