單例模式又稱單件模式,是一種常用的軟體設計模式。其核心目的是確保一個類別在整個程式執行期間只有一個實例存在,並提供一個全域存取點供所有模組共同使用。常見應用場景包括系統日誌記錄器、設定管理器、資料庫連線池等。
最基礎的單例類別包含三個關鍵要素:私有靜態指標指向唯一實例、私有建構函式防止外部建立實例、公有靜態方法提供存取點。以下是典型程式碼結構:
class CSingleton {
public:
static CSingleton* GetInstance() {
if (m_pInstance == NULL)
m_pInstance = new CSingleton();
return m_pInstance;
}
private:
CSingleton() {}
static CSingleton* m_pInstance;
};
上述簡單實作存在嚴重缺陷:單例實例佔用的記憶體永遠不會被釋放,析構函式也永遠不會被呼叫。若類別持有檔案控制代碼、網路連線等外部資源,將導致資源洩漏。
利用 C++ 程式結束時自動析構靜態成員變數的特性,我們可以在單例類別內部定義一個專門負責清理的巢狀類別:
class CSingleton {
public:
static CSingleton* GetInstance() {
if (m_pInstance == NULL)
m_pInstance = new CSingleton();
return m_pInstance;
}
private:
CSingleton() {}
static CSingleton* m_pInstance;
class CGarbo { // 垃圾回收類別
public:
~CGarbo() {
if (CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static CGarbo Garbo; // 靜態成員,程式結束時自動析構
};
上述實作在多執行緒環境下非安全。現代 C++ (C++11 以後) 建議使用區域靜態變數實作,編譯器保證執行緒安全:
class Singleton {
public:
static Singleton& GetInstance() {
static Singleton instance; // C++11 保證執行緒安全初始化
return instance;
}
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
此寫法同時解決了建立時機、記憶體管理、複製防護等所有問題,是現代 C++ 推薦的標準寫法。