单例模式的使用场景 以及 饿汉式写法(智能指针)

发布于:2025-04-22 ⋅ 阅读:(80) ⋅ 点赞:(0)

饿汉式:创建类时就已经创建好了类的实例(用智能指针实现)

#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);
类似于管理日志输出通道
总结

如果确定这个类的实例 在全局只有一个,那么就可以试试单例模式,总归有好处。另外,饿汉式 启动时(即加载类时)立即初始化,适合资源预分配场景。懒汉式 延迟初始化,首次调用时创建,节省启动时间。


网站公告

今日签到

点亮在社区的每一天
去签到