详细介绍一下单例模式的几种模式
时间: 2024-09-28 19:09:33 浏览: 17
单例模式是一种常用的软件设计模式,它确保一个类只有一个实例存在,同时提供全局访问点。以下是三种常见的单例模式实现方法:
1. **懒汉式单例** (Singleton via Lazy Initialization):
这种是最简单的实现方式,只有当首次请求时才会创建单例实例。代码通常使用静态变量和构造函数的私有化来保证这一点。
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 构造函数私有化
public:
static Singleton& getInstance() {
if (!instance) {
instance = new Singleton();
}
return *instance;
}
// 其他公共方法...
};
Singleton* Singleton::instance = nullptr; // 初始化为nullptr
```
2. **饿汉式单例** (Singleton via Eager Initialization):
这个版本在程序启动时就创建了单例,所以不需要线程同步,但可能导致早期内存开销较大。
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton& getInstance() {
return *instance;
}
// 其他公共方法...
};
Singleton* Singleton::instance = new Singleton(); // 在编译期间初始化
```
3. **双重检查锁定单例** (Double-Check Locking):
在多线程环境下,为了防止多次初始化,使用了双重检查锁定。这种方法只在第一次检查到没有实例时才加锁并创建实例,确保线程安全。
```cpp
class Singleton {
private:
static Singleton* instance;
static bool initialized;
Singleton() {} // 构造函数私有化
friend class SingletonConstructorLock; // 需要友元类帮助初始化
public:
static Singleton& getInstance() {
if (!initialized) { // 第二次检查才加锁
std::call_once(initializedLock, &Singleton::initialize);
}
return *instance;
}
static void initialize() {
instance = new Singleton();
initialized = true;
}
// 其他公共方法...
};
Singleton* Singleton::instance = nullptr;
std::mutex initializedLock;
bool Singleton::initialized = false;
```