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

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

单例模式的实现思路

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

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

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

代码实现

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

cpp 复制代码
#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() 方法时都加锁的开销。这种实现方式既保证了线程安全,又提高了性能。

相关推荐
AI的探索之旅19 小时前
97 个 OpenCV 实例(三十七):二维码识别,一张图四个码的陷阱
c++·opencv·计算机视觉
UIU11420 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
raindayinrain20 小时前
c++设计模式
开发语言·c++·设计模式
旖旎夜光20 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
工一木子20 小时前
设计模式与生活⑦:你打的车,隔着一个平台
设计模式
D e re k ZH20 小时前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂20 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
电子科技圈20 小时前
2026 RISC-V中国峰会观察:编译调试工具链的“在场节奏”,释放了什么信号?
大数据·人工智能·设计模式·软件工程·软件构建·代码规范·risc-v
octopus_c21 小时前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
青少儿编程课堂21 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛