一、什么是单例模式?
单例模式(Singleton Pattern)保证:
- 类只有一个实例
- 并提供一个对该实例的全局访问方式
适用场景:
- 需要全局唯一对象
- 资源消耗大,不适合频繁创建
如:日志系统、配置管理、数据库连接管理等
二、为什么要使用单例模式?
如果一个类在系统中被多次实例化,可能会带来问题:
使用单例模式,可以:
- 保证唯一实例,节省资源
- 全局访问方便
- 控制初始化与生命周期
- 避免多对象修改导致的状态不一致
若不使用单例:
- 可能生成多个实例
- 资源浪费
- 状态难同步
三、现实生活类比 🏢
电梯调度系统:
整栋楼只有一个电梯调度中心
所有电梯请求都由它集中管理
类似"全局唯一对象"
它必须单例,否则多个调度中心会互相冲突。
四、代码示例
不使用单例模式
cpp
#include <iostream>
using namespace std;
class Logger {
public:
void log(const string& message)
{
cout << "[Log] " << message << endl;
}
};
int main()
{
Logger logger1;
Logger logger2;
logger1.log("Hello");
logger2.log("World");
}
使用单例模式
cpp
#include <iostream>
#include <mutex>
using namespace std;
class Logger {
private:
Logger() {} // 构造函数私有
Logger(const Logger&) = delete; // 禁止拷贝
Logger& operator=(const Logger&) = delete;
static Logger* instance;
static mutex mtx;
public:
static Logger* getInstance() {
if (instance == nullptr) {
lock_guard<mutex> lock(mtx);
if (instance == nullptr) {
instance = new Logger();
}
}
return instance;
}
void log(const string& msg) {
cout << "[Log] " << msg << endl;
}
};
Logger* Logger::instance = nullptr;
mutex Logger::mtx;
int main() {
Logger* logger = Logger::getInstance();
logger->log("Singleton Hello");
}