单例模式的使用场景 以及 饿汉式写法(智能指针)
- 饿汉式:创建类时就已经创建好了类的实例(用智能指针实现)
- 什么时候用单例模式:
- 1. 全局配置管理
- 2. 日志系统
- 3. 资源管理器
- 4. 硬件设备访问
- 总结
饿汉式:创建类时就已经创建好了类的实例(用智能指针实现)
#include <memory>
class Single
{
private:Single(){}~Single(){}Single(const Single& single)=delete;Single& operator=(const Single& single)=delete;
private:static std::shared_ptr<Single> singlePtr;
public://获取实例static std::shared_ptr<Single>& getInstance(){return singlePtr;}
};
std::shared_ptr<Single> singlePtr=std::make_shared<Single>();
什么时候用单例模式:
1. 全局配置管理
当需要集中管理 全局配置数据 时(如数据库连接参数、系统路径配置),使用单例模式可确保所有模块访问的是同一份配置数据。例如:
class ConfigManager {
public:static ConfigManager& getInstance() {static ConfigManager instance;return instance;}std::string getValue(const std::string& key) const;
private:std::unordered_map<std::string, std::string> configMap;
};
所有组件通过ConfigManager::getInstance()
获取统一配置。
2. 日志系统
日志记录器需要保证 全局唯一的输出通道,避免多线程环境下 日志文件被重复打开:
Logger::getInstance().writeLog("System initialized");
这里的单例就是指唯一的日志输出通道
3. 资源管理器
管理数据库连接池、线程池等稀缺资源时,单例模式可确保 资源分配策略 的一致性:
ConnectionPool& pool = ConnectionPool::getInstance();
auto conn = pool.getConnection(); // 统一分配连接
这个单例就是这个线程池
4. 硬件设备访问
对打印机、串口等独占式硬件设备的访问控制,单例模式能防止设备冲突:
SerialPort::getInstance().sendData(dataBuffer);
类似于管理日志输出通道
总结
如果确定这个类的实例 在全局只有一个,那么就可以试试单例模式,总归有好处。另外,饿汉式 启动时(即加载类时)立即初始化,适合资源预分配场景。懒汉式 延迟初始化,首次调用时创建,节省启动时间。