iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Software Development

深入淺出設計模式 - 使用 C++系列 第 8

[Day 08] 獨一無二的物件 - 單例模式 (Singleton Pattern)

  • 分享至 

  • xImage
  •  

單例模式 (Singleton Pattern)

  • Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance

範例 (非書本)

class Singleton {
private:
    static Singleton* instance;
    Singleton() {} // 私有構造函數,這樣外部無法使用此構造函數來創建多個實例

public:
    // 刪除複製構造函數和賦值操作,確保不能複製此類的實例
    Singleton(Singleton &other) = delete;
    void operator=(const Singleton &) = delete;

    // 獲取 Singleton 類的唯一實例的靜態函數
    static Singleton* getInstance() {
        if (instance == nullptr) { // 如果還沒有創建實例,則創建一個 (Lazy-Init 的概念)
            instance = new Singleton();
        }
        return instance;
    }

    // 示範
    void showMessage() {
        std::cout << "Hello, this is Singleton!" << std::endl;
    }
};

// 初始化靜態 Pointer 為 nullptr
Singleton* Singleton::instance = nullptr;

int main() {
    // 試圖獲取 Singleton 的實例
    Singleton* single = Singleton::getInstance();
    single->showMessage(); // 應該顯示 "Hello, this is Singleton!"
}

什麼時後適合單例模式:

  • 單一實例:當你想確保某個類只有一個實例,且該實例可以從系統的任何地方方便地訪問
  • 控制資源的訪問:當你需要控制對某些共享資源的訪問,如配置管理或連接池,單例模式可以確保所有對該資源的訪問都是同步和集中的
  • 延遲初始化:當某個物件的創建非常昂貴或複雜,且該物件在程序啟動時不必立即可用,則可以使用單例模式來延遲初始化,直到真正需要它為止
    全域狀態:當你需要一個物件來代表某個全域狀態共享數據,單例可以作為全域點,允許不同部分的系統訪問和更新該狀態

單例模式的類型:

  • Lazy Initialization
    • 單例實例只在第一次請求時創建,這種方式可以節省資源,特別是在實例的創建成本很高
  • Eager Initialization (立即初始化):
    • 單例實例在程式啟動或該類被加載時就立即創建。這確保了實例在任何情況下都是可用的,但可能會增加啟動時間
  • Registry Singleton
    • 在某些情境下,利用註冊表 (Registry, or Map) 或字典 (Dict) 來保存和管理所有的實例是很有用的,使應用可以隨時存取或注冊新的單例
    • 非常適合在需要動態地創建和管理多個單例時使用,或者當你想避免在編譯時就決定哪些單例會被使用時

Thread-safe Singleton:

  • 多線程環境中,確保單例實例的創建和訪問都是線程安全的。這通常需要加**鎖 (Lock) **機制來達成
  • Double Checked Locking
    • 這是一種特殊的線程安全單例模式,它首先檢查實例是否已經存在,如果不存在,則使用同步塊(synchronized block)進行再次檢查並創建實例。這種方式可以減少同步的開銷

Reference

[1]. https://shengyu7697.github.io/cpp-singleton-pattern/
[2]. https://ithelp.ithome.com.tw/articles/10225413
[3]. https://refactoring.guru/design-patterns/singleton


上一篇
[Day 07] 經典比較 — Simple Factory / Factory / Abstract Factory
下一篇
[Day 09] 將方法的呼叫封裝起來 - 命令模式 ( Command Pattern )
系列文
深入淺出設計模式 - 使用 C++37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言