在软件开发中,单例模式是一种常见的设计模式。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在很多场景下都非常有用,比如配置管理、日志记录等,因为在这些场景中,我们通常只需要一个全局的实例来处理相关事务。
单例模式的实现思路
单例模式的实现主要有以下几个关键点:
- 私有化构造函数:防止外部代码直接创建类的实例。
- 静态成员变量:用于存储类的唯一实例。
- 静态成员函数:提供一个全局访问点,用于获取类的唯一实例。
为了确保线程安全,在多线程环境下,我们还需要对实例的创建过程进行同步处理。
代码实现
下面是一个使用 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
代码解释
- 模板类
CSingleton
:这是一个模板类,允许我们将任意类型T
转换为单例模式。 Instance()
方法:这是获取单例实例的静态方法。它采用了双重检查锁定(Double-Checked Locking)机制,先检查实例是否已经创建,如果没有创建,则加锁再次检查,确保在多线程环境下只有一个实例被创建。Destory()
方法:这是销毁单例实例的静态方法,用于释放实例占用的内存。- 构造函数和拷贝构造函数:构造函数和拷贝构造函数被声明为
protected
,防止外部代码直接创建或拷贝实例。 - 赋值运算符:赋值运算符被声明为
protected
,防止通过赋值操作创建新的实例。 - 静态成员变量:
m_pInstance
用于存储单例实例,mutex
用于线程同步。
总结
通过上述代码,我们实现了一个线程安全的单例模式。双重检查锁定机制确保了在多线程环境下只有一个实例被创建,同时避免了每次调用 Instance()
方法时都加锁的开销。这种实现方式既保证了线程安全,又提高了性能。