C++ 单例设计模式
时间: 2024-12-26 18:22:17 浏览: 13
### C++ 中的单例设计模式实现
#### 实现方式一:懒汉式(Lazy Initialization)
懒汉式的单例模式会在第一次调用 `getInstance` 方法时创建实例。
```cpp
class Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
private:
Singleton() {}
static Singleton* instance;
};
Singleton* Singleton::instance = nullptr;
```
这种方式简单易懂,但在多线程环境下可能会出现问题[^1]。
#### 实现方式二:饿汉式(Eager Initialization)
饿汉式的单例模式在类加载时就创建好实例,避免了懒汉式中可能出现的线程安全问题。
```cpp
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
};
```
这种方法利用了局部静态变量的特点,在首次访问时初始化对象,并且是线程安全的。
#### 实现方式三:双重检查锁定(Double-Checked Locking)
为了提高性能并保持线程安全性,可以采用双重检查锁定机制来优化懒汉式实现:
```cpp
#include <mutex>
class Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) { // First check before locking
std::lock_guard<std::mutex> lock(mutex_);
if (instance == nullptr) { // Second check after acquiring the lock
instance = new Singleton();
}
}
return instance;
}
private:
Singleton() {}
static Singleton* instance;
static std::mutex mutex_;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;
```
此方法减少了不必要的同步开销,适用于高并发场景下的单例管理。
#### 防止克隆破坏单例特性
为了避免通过复制构造函数或赋值操作符意外地创建新的实例,应该禁用这些功能:
```cpp
class Singleton {
public:
static Singleton& getInstance();
protected:
Singleton() {};
private:
Singleton(const Singleton&) = delete; // Prevent copy construction
Singleton& operator=(const Singleton&) = delete; // Prevent assignment
~Singleton() {}; // Destructor should also be protected/private
};
```
上述措施确保了即使有人尝试拷贝现有实例也不会成功,从而维护了单例性质[^2]。
阅读全文