C++单例模式有哪些常见的实现方法?
时间: 2024-09-06 15:08:23 浏览: 59
C++中有几种常见的实现单例模式的方式:
1. **懒汉式**(Lazy Initialization):这是最简单的实现,只有在第一次真正使用时才会实例化单例。这种方式可能会导致线程安全问题,如果多个线程同时访问,就需要加锁处理。
```cpp
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
Singleton(Singleton const&) = delete; // 防止复制构造
void operator=(Singleton const&) = delete; // 防止赋值操作
};
```
2. **饿汉式**(Eager Initialization):预先在静态初始化区实例化,保证线程安全,但可能导致资源浪费。
```cpp
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {} // 提前实例化
};
```
3. **双重检查锁定**(Double-Check Locking):结合懒汉式和饿汉式的优点,仅在需要时锁定,提高效率,同时解决了线程安全问题。
```cpp
class Singleton {
private:
static Singleton* instance;
bool initialized;
public:
Singleton() : initialized(false) {}
static Singleton& getInstance() {
if (!instance) {
std::call_once(initializedFlag, &Singleton::createInstance);
}
return *instance;
}
private:
static void createInstance() {
std::lock_guard<std::mutex> lock(singletonMutex);
if (!instance) { // 确保实例只被创建一次
instance = new Singleton();
}
}
};
```
这里`singletonMutex`是一个互斥锁。
4. **静态工厂函数**:通过将单例的创建封装到一个静态成员函数中,间接实现了单例,避免了直接暴露实例。
```cpp
class Singleton {
public:
static Singleton* create() {
static Singleton* instance = new Singleton();
return instance;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
```
每种实现都有其适用的场景和优缺点,开发者需要根据具体需求选择合适的方案。
阅读全文