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

C++ 单例模式一种实现方式

在软件开发中,单例模式是一种常见的设计模式。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在很多场景下都非常有用,比如配置管理、日志记录等,因为在这些场景中,我们通常只需要一个全局的实例来处理相关事务。

单例模式的实现思路

单例模式的实现主要有以下几个关键点:

  1. 私有化构造函数:防止外部代码直接创建类的实例。
  2. 静态成员变量:用于存储类的唯一实例。
  3. 静态成员函数:提供一个全局访问点,用于获取类的唯一实例。

为了确保线程安全,在多线程环境下,我们还需要对实例的创建过程进行同步处理。

代码实现

下面是一个使用 C++ 实现的单例模式代码示例:

#ifndef __SINGLETON_H
#define __SINGLETON_H
#include "sync.h"template<class T>
class CSingleton
{
public:static T* Instance(){if (NULL == m_pInstance){MutexObject lock(&mutex);if (NULL == m_pInstance){T* ptmp = new T();m_pInstance = ptmp;}}return m_pInstance;} static void Destory(){if (m_pInstance){delete m_pInstance;m_pInstance = NULL;}}protected://防止实例CSingleton() {}//防止拷贝构造一个实例CSingleton(const CSingleton&) {}//防止赋值出另一个实例CSingleton& operator=(const CSingleton&){} virtual ~CSingleton(){}private:static T*		m_pInstance;static Mutex	mutex;
};template<class T> T* CSingleton<T>::m_pInstance = NULL;
template<class T> Mutex CSingleton<T>::mutex;#endif

代码解释

  1. 模板类 CSingleton:这是一个模板类,允许我们将任意类型 T 转换为单例模式。
  2. Instance() 方法:这是获取单例实例的静态方法。它采用了双重检查锁定(Double-Checked Locking)机制,先检查实例是否已经创建,如果没有创建,则加锁再次检查,确保在多线程环境下只有一个实例被创建。
  3. Destory() 方法:这是销毁单例实例的静态方法,用于释放实例占用的内存。
  4. 构造函数和拷贝构造函数:构造函数和拷贝构造函数被声明为 protected,防止外部代码直接创建或拷贝实例。
  5. 赋值运算符:赋值运算符被声明为 protected,防止通过赋值操作创建新的实例。
  6. 静态成员变量m_pInstance 用于存储单例实例,mutex 用于线程同步。

总结

通过上述代码,我们实现了一个线程安全的单例模式。双重检查锁定机制确保了在多线程环境下只有一个实例被创建,同时避免了每次调用 Instance() 方法时都加锁的开销。这种实现方式既保证了线程安全,又提高了性能。

http://www.lqws.cn/news/451585.html

相关文章:

  • Cesium、ThreeWebGL详解(二)渲染引擎向GPU传数据、性能优化、引擎对比
  • 使用 C++/OpenCV 构建中文 OCR 系统:实现账单、发票及 PDF 读取
  • 云计算处理器选哪款?性能与能效的平衡艺术
  • 动态WCMP+Flowlet ALB:双引擎驱动智算网络负载均衡
  • 【Pandas】pandas DataFrame explode
  • shel脚本重启Jar服务
  • 对接世界职业院校技能大赛标准,唯众打造高质量物联网实训室
  • 第二章 SQL编程系列-SQL编程基础
  • 人力资源战略重构,AI驱动高质量发展论坛顺利召开
  • OpenGL和OpenGL ES区别
  • Unity渲染管线 Global Volume 及 Post-processing
  • MACOS系统运行模拟器畅玩SWITCH游戏
  • Windsurf SWE-1模型评析:软件工程的AI革命
  • 用 DeepSeek 打造智能高考志愿填报推荐系统
  • 腾讯混元3D制作简单模型教程-2
  • c++set和pair的使用
  • Vue + AbortController 请求取消弹窗 hook 封装
  • 【Redis】解码Redis字符串:命令执行与内存优化背后的编码逻辑
  • Excel批量计算时间差
  • 邮件合并----批量从excel表中导出数据到word中
  • Linux -- 线程、锁
  • 在spring boot中使用Logback
  • 【Wi-Fi天气时钟】ESP-01S固件烧录与测试
  • (亚马逊2025峰会)7个AIGC应用案例
  • 150页PPT麦肯锡波士顿解决问题方法
  • 前端应用更新提示的优雅实现:如何让用户及时刷新页面?
  • 【内存】Linux 内核优化实战 - vm.panic_on_oom
  • 20250620在Ubuntu20.04.6下编译KickPi的K7的Android14系统
  • 无人机低空经济十大前沿创新应用探索-具体做无人机什么呢?优雅草卓伊凡
  • Spring---Spring MVC 执行流程