单例模式(Singleton Pattern)是设计模式中最为经典和常用的模式之一,它确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式时,需要考虑线程安全、懒加载以及资源管理等问题。
单例模式的核心思想是通过控制类的实例化过程,确保整个程序运行期间该类只有一个实例存在。这种模式通常用于系统配置管理器、日志记录器等场景。
以下是单例模式的一个基本实现:
class Singleton {
private:
static Singleton* instance; // 静态指针,存储唯一实例
Singleton() {} // 私有构造函数,防止外部实例化
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton(); // 懒加载,首次调用时创建实例
}
return instance;
}
~Singleton() { /* 析构函数 */ }
};
// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
上述实现存在线程安全问题,当多个线程同时调用getInstance()
方法时,可能会创建多个实例。为了解决这个问题,可以使用双重检查锁定(Double-Checked Locking)或C++11及以后的标准提供的线程安全初始化方法。
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mutex;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) { // 第一次检查
std::lock_guard<std::mutex> lock(mutex); // 加锁
if (instance == nullptr) { // 第二次检查
instance = new Singleton();
}
}
return instance;
}
~Singleton() {}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
C++11标准规定静态局部变量的初始化是线程安全的,因此可以简化代码:
class Singleton {
private:
Singleton() {}
public:
static Singleton& getInstance() {
static Singleton instance; // 静态局部变量,线程安全
return instance;
}
};
单例对象的生命周期通常与程序的生命周期一致,但在某些情况下可能需要手动释放资源。可以通过智能指针或显式销毁来管理资源。
#include <memory>
class Singleton {
private:
static std::unique_ptr<Singleton> instance;
Singleton() {}
public:
static Singleton& getInstance() {
if (!instance) {
instance.reset(new Singleton());
}
return *instance;
}
static void destroy() {
instance.reset(); // 手动销毁单例对象
}
};
std::unique_ptr<Singleton> Singleton::instance = nullptr;
sequenceDiagram participant Caller participant Singleton Caller->>Singleton: 调用getInstance() alt 如果实例不存在 Singleton->>Singleton: 创建新实例 end Singleton-->>Caller: 返回实例