【C++】【设计模式】单例模式(Singleton Pattern)
定义
- 创建型模式(Creational Pattern)
- 确保一个类只有一个实例,自行创建该实例,并提供全局访问该实例的方法
- 减少对象多次创建与销毁,节省系统时间与资源
- 保证系统资源被统一管理
结构
- 单例
-
- 私有实例
-
- 共有访问方法
-
- 私有构造
-
- 禁用复制构造
-
- 禁用赋值运算
UML类图
Demo源码
饿汉式单例模式
#include <iostream>
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
void doSomething() {
std::cout << "Singleton instance is doing something." << std::endl;
}
private:
Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
int main() {
Singleton& singleton = Singleton::getInstance();
singleton.doSomething();
return 0;
}
懒汉式单例模式(线程安全)
#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
// 双重检查锁定
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
}
return *instance;
}
void doSomething() {
std::cout << "Singleton instance is doing something." << std::endl;
}
private:
Singleton() {}
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
static Singleton* instance;
static std::mutex mutex;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
int main() {
Singleton& singleton = Singleton::getInstance();
singleton.doSomething();
return 0;
}
分析总结
- 优点:保证唯一性、利于共享、节约资源
- 缺点:没有抽象层、不易拓展,一定程度违背单一职责原则
- 其他:可灵活调整为多例