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

C++ 单例模式实现

单例模式(Singleton Pattern)是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。

基本实现

懒汉式(线程不安全)

class Singleton {
private:static Singleton* instance;// 私有构造函数防止外部实例化Singleton() {}public:// 删除拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}
};// 初始化静态成员
Singleton* Singleton::instance = nullptr;

饿汉式(线程安全)

class Singleton {
private:static Singleton instance;Singleton() {}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() {return instance;}
};// 在程序开始前就初始化
Singleton Singleton::instance;

线程安全的懒汉式实现

使用双重检查锁定(C++11及以上)

#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {}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;}
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

使用局部静态变量(C++11及以上,最简洁的线程安全实现)

class Singleton {
private:Singleton() {}public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() {static Singleton instance;return instance;}
};

单例模式的优缺点

优点:

  1. 确保一个类只有一个实例

  2. 提供全局访问点

  3. 避免频繁创建和销毁对象,节省系统资源

缺点:

  1. 违反单一职责原则(既管理实例又包含业务逻辑)

  2. 可能导致代码耦合度高

  3. 难以进行单元测试

  4. 在多线程环境下需要特殊处理

使用场景

  1. 需要频繁创建和销毁的对象

  2. 创建对象耗时或资源消耗大

  3. 工具类对象

  4. 访问数据库或文件的对象

在现代C++中,推荐使用局部静态变量的实现方式,它简洁且线程安全(C++11保证局部静态变量的初始化是线程安全的)。

http://www.xdnf.cn/news/15292.html

相关文章:

  • 牛客周赛 Round 100
  • AB实验评估指标体系之【实验评估指标体系】
  • 【Linux | 网络】应用层(HTTP)
  • RabbitMQ 之仲裁队列
  • 决策树的相关理论学习
  • 慢慢理解this
  • Dify离线安装包-集成全部插件、模板和依赖组件,方便安可内网使用
  • Matlab批量转换1km降水数据为tiff格式
  • 业务访问控制-ACL与包过滤
  • Qt窗口:QToolBar、QStatusBar、QDockWidget、QDialog
  • vue3 ref vs reactive值的修改
  • es里为什么node和shard不是一对一的关系
  • Git 使用笔记
  • 使用Starrocks替换Clickhouse的理由
  • SPSSPRO:数据分析市场SaaS挑战者的战略分析
  • 香港服务器Python自动化巡检脚本开发与邮件告警集成
  • 【Linux】线程机制深度实践:创建、等待、互斥与同步
  • 网络协议学习思维导图
  • python爬取新浪财经网站上行业板块股票信息的代码
  • java进阶(二)+学习笔记
  • 【算法】递归、搜索与回溯
  • Datawhale AI 夏令营2025科大讯飞AI大赛<夏令营:用AI做带货视频评论分析>
  • [Nagios Core] CGI接口 | 状态数据管理.dat | 性能优化
  • jenkins部署前端vue项目使用Docker+Jenkinsfile方式
  • 【星闪】Hi2821 | SDK开发入门,应用启动流程,创建自己的应用
  • 大模型聊天模板
  • 在人工智能自动化编程时代:AI驱动开发和传统软件开发的分析对比
  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • Infoblox NetMRI 远程命令执行漏洞复现(CVE-2025-32813)
  • C++值类别与移动语义