C++实现设计模式---单例模式 (Singleton)

news/2025/1/15 18:34:24/

单例模式 (Singleton)

概念

单例模式 确保一个类在整个程序生命周期中只有一个实例,并提供一个全局访问点。
它是一种创建型设计模式,广泛用于需要共享资源的场景。


使用场景

  1. 配置管理器:程序中需要一个全局的配置对象。
  2. 日志系统:确保日志记录器只有一个实例。
  3. 数据库连接池:共享一个数据库连接实例。

实现单例模式的要点

  1. 私有构造函数:防止外部通过 new 操作符创建实例。
  2. 静态成员变量:保存类的唯一实例。
  3. 静态方法:提供全局访问点。
  4. 线程安全:确保多线程环境下实例只有一个。

示例代码:线程安全的单例模式

#include <iostream>
#include <mutex>// 单例类定义
class Singleton {
private:// 静态实例指针,用于保存唯一实例static Singleton* instance;// 互斥锁,保证多线程环境下的线程安全static std::mutex mtx;// 私有构造函数,禁止外部实例化Singleton() {std::cout << "Singleton Created!" << std::endl;}public:// 禁止拷贝构造和赋值操作Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 静态方法,用于获取唯一实例static Singleton* getInstance() {// 双重检查锁定,减少锁的开销if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx); // 加锁if (instance == nullptr) {instance = new Singleton(); // 创建唯一实例}}return instance;}// 提供一些功能方法void doSomething() {std::cout << "Singleton is working!" << std::endl;}// 销毁实例(可选)static void destroyInstance() {delete instance;instance = nullptr;}
};// 静态成员变量初始化
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;// 主函数:测试单例模式
int main() {// 获取单例实例Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();// 调用单例方法s1->doSomething();// 检查两个实例是否相同std::cout << "Are s1 and s2 the same? " << (s1 == s2 ? "Yes" : "No") << std::endl;// 销毁单例实例Singleton::destroyInstance();return 0;
}

代码详解

1. 私有化构造函数

  • 目的:禁止通过 new 操作符创建实例。
Singleton() {std::cout << "Singleton Created!" << std::endl;
}

2. 静态成员变量

  • 保存唯一的单例实例,初始值为 nullptr
static Singleton* instance;

3. 互斥锁

  • 确保在多线程环境下,多个线程不会同时创建实例。
static std::mutex mtx;

4. 静态方法 getInstance

  • 提供唯一实例的全局访问点。
  • 双重检查锁定:减少锁的开销,提高性能。
static Singleton* getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = new Singleton();}}return instance;
}

5. 销毁实例

  • 可选:在程序结束时清理单例实例。
static void destroyInstance() {delete instance;instance = nullptr;
}

运行结果

执行代码输出

Singleton Created!
Singleton is working!
Are s1 and s2 the same? Yes

单例模式的优缺点

优点

  1. 全局唯一实例:确保实例唯一性。
  2. 延迟初始化:实例在第一次使用时才会创建。
  3. 线程安全:双重检查锁定保证线程安全。

缺点

  1. 难以测试单例模式引入全局状态,可能影响单元测试。
  2. 不适合频繁访问的场景:线程安全的实现有一定性能开销。
  3. 内存泄漏风险:如果程序结束时未释放实例,可能造成内存泄漏。

适合扩展的改进

  1. 懒汉式与饿汉式:可选择延迟初始化(懒汉式)或直接初始化(饿汉式)。
  2. 智能指针管理:用 std::unique_ptr 管理单例实例,避免内存泄漏。
  3. 多线程优化:采用 C++11 的 std::call_once 确保线程安全。

http://www.ppmy.cn/news/1563395.html

相关文章

无人机+无人车:车机协同技术探索详解

无人机与无人车之间的协同技术是一种重要的研究方向&#xff0c;它结合了无人机的高空视野和无人车的地面移动能力&#xff0c;旨在实现更高效、灵活的作业。以下是对无人机与无人车车机协同技术的详细探索&#xff1a; 一、技术基础 1. 通信机制&#xff1a; 无人机与无人车…

【25考研】西南交通大学计算机复试重点及经验分享!

一、复试内容 上机考试&#xff1a;考试题型为编程上机考试&#xff0c;使用 C 语言&#xff0c;考试时长包括 15 分钟模拟考试和 120 分钟正式考试&#xff0c;考试内容涵盖顺序结构、选择结构、循环结构、数组、指针、字符串处理、函数、递归、结构体、动态存储、链表等知识点…

大语言模型分词器

大语言模型分词器 代码 import transformers import tokenizersfrom transformers import AutoTokenizertokenizers AutoTokenizer.from_pretrained("data/bert-base-uncased")text "This is a test sentence."tokens tokenizers.encode(text) token_…

Python实现windows自动关机

python <shut.py> import ntplib from datetime import datetime, timezoneimport time import osimport easygui# net time def get_network_time():time.sleep(3)"""从网络时间服务器获取时间"""client ntplib.NTPClient()response c…

【Vue】mouted、created、computed区别

mouted、created、computed区别 前端vue重构 — computed、watch、组件通信等常用知识整理 created和mouted都是vue生命周期中的钩子函数&#xff0c;通常用来做一些初始化的工作&#xff0c;比如发送http请求、对组件绑定自定义事件 created&#xff1a;实例创建完后立即调用…

MAC AndroidStudio模拟器无网络

先确认PC端是正常访问网络的&#xff1b; 模拟器端修改Wifi设置&#xff1a;设置 - 网络和互联网 - WALN设置 按照上图修改&#xff1b; IP设置&#xff1a;从DHCP修改为静态&#xff0c;IP地址&#xff1a;10.0.2.16 &#xff0c;网关&#xff1a;10.0.2.2 &#xff0c; DNS…

Vue进阶之AI智能助手项目(三)——多种主流LLM集成封装

AI智能助手项目 文件目录入口代码 src前提-使用哪些llm模型.env百度飞桨阿里通义千问Imagine Artsrc入口文件:src/index.ts文心一言src/ernie/index.tssrc/ernie/resources/chat/completions.tssrc/ernie/resources/chat/chat.tssrc/ernie/resources/embeddings.ts通义千问src/…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…