單例模式的使用場景 以及 餓漢式寫法(智能指針)
- 餓漢式:創建類時就已經創建好了類的實例(用智能指針實現)
- 什么時候用單例模式:
- 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);
類似于管理日志輸出通道
總結
如果確定這個類的實例 在全局只有一個,那么就可以試試單例模式,總歸有好處。另外,餓漢式 啟動時(即加載類時)立即初始化,適合資源預分配場景。懶漢式 延遲初始化,首次調用時創建,節省啟動時間。