首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

單例模式深度解析:從經典實作到現代最佳實踐

     編輯:關於C++

單例模式核心意圖

確保類別在整個系統中僅存在一個實例,並提供全域存取點。適用場景:滑鼠、調製解調器連線、視窗管理器、鍵盤裝置等系統級唯一資源。

經典實作:靜態成員與延遲初始化

class Singleton {
public:
    static Singleton* Instance();
protected:
    Singleton();                          // 防止外部建構
    Singleton(const Singleton&);          // 防止複製
    Singleton& operator=(const Singleton&); // 防止賦值
private:
    static Singleton* pinstance;
};

Singleton* Singleton::pinstance = nullptr;

Singleton* Singleton::Instance() {
    if (pinstance == nullptr) {
        pinstance = new Singleton;  // 延遲初始化
    }
    return pinstance;
}

特點: 延遲初始化、執行緒不安全(多執行緒需加鎖)、需手動 delete 否則記憶體洩漏且析構函數不會被呼叫。

單執行緒優化:區域靜態變數

Singleton* Singleton::Instance() {
    static Singleton inst;  // C++ 標準保證第一次呼叫時建構,程式結束時自動解構
    return &inst;
}

優勢:

  • 無需手動管理記憶體,程式結束自動釋放資源並呼叫析構函式。
  • 程式碼簡潔,消除 pinstance 靜態成員。
  • 適用於單執行緒環境或 C++11 以降(保證執行緒安全初始化)。

可變多實例擴充

修改 Instance() 邏輯即可支援固定數量實例(如連線池最多 5 個):

Singleton* Singleton::Instance() {
    static std::vector<Singleton*> instances;
    if (instances.size() < MAX_INSTANCES) {
        instances.push_back(new Singleton);
    }
    return instances[current_index++ % MAX_INSTANCES];
}

現代 C++ 最佳實踐建議

  1. C++11 以降: 優先使用區域靜態變數,編譯器保證執行緒安全初始化。
  2. 避免全域單例: 考慮依賴注入傳遞單例參考,提高可測試性。
  3. 多執行緒環境: 若非 C++11,需使用 std::call_once 或雙重檢查鎖定模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved