古典名著看設計模式 – 宋江一統梁山泊 — 單例 (Singleton) 模式

前言

在軟體系統中,有時我們需要確保某個類別在整個系統中只存在唯一的實例 (instance) 物件,或者需要一個全域存取點 (global access point) 來管理全域性資源。例如系統中的設定管理、日誌記錄、設備監控等,都不適合有多個實例同時運行。

若讓這些類別可以任意實例化,可能導致系統資源浪費、狀態不一致,甚至引發嚴重的邏輯錯誤。我們需要一種機制來約束類別只能建立單一實例,並提供一個全域存取點。

Singleton 模式的核心價值在於,它確保類別僅存在唯一實例,並提供統一的存取方式,從而保證系統資源的合理利用與全域狀態的一致性。

以《水滸傳》中的宋江為例,他作為梁山泊的唯一領袖,統籌管理整個寨子的事務。梁山好漢們有事都要找大哥宋江商議,無事則一同享樂。宋江是梁山泊的唯一權威中心,確保了山寨上下令行禁止,避免了多頭領導可能造成的混亂。這種「唯一實例、全域存取」的特性正體現了 Singleton 模式的精髓。

宋江一統梁山泊 – 單例模式

自從宋江上梁山泊以來,山寨聲勢越發興旺。四方豪傑聞風而來,紛紛投奔梁山。** 只今梁山泊上共有大小頭領三十六員,便是魯智深、武松、林沖這般英雄好漢,也都讓他是大哥。** 宋江待眾頭領如同手足,有事共商,無事同樂,梁山上下一片和氣。每日操練軍馬,積蓄糧草,招納四方好漢,打造兵器,整頓戰船,以備不時之需。宋江更是廣施恩德,救濟貧民,打富濟貧,名聲遠播。

代理模式的範例 - 孫悟空分身大戰牛魔王

《水滸傳》中,宋江作為梁山泊的頭領,是整個梁山泊的唯一領導者,符合 Singleton 模式中「唯一實例」的特性。

梁山泊的好漢們均是透過宋江來取得行動的資訊,這體現了Singleton 模式中「全域存取點」的原則。

宋江的存在確保了梁山泊的統一與秩序,避免了多頭領導的混亂。這種「有事共商,無事同樂」正是體現了 Singleton 模式對共享資源的統一管理,避免衝突和不一致狀態的設計目的。

下圖為應用 Singleton 模式來解析宋江角色的類別圖。

眾英雄好漢 (client) 調用 Getinsance() 方法以取得唯一的宋江實例,而其它方法如 分配職務()、有事共商()、無事同樂() 則代表宋江作為單例所提供的功能。

Singleton 模式核心概念

Singleton 模式是一種生成式 (creational) 設計模式,其目的是確保一個類別在整個應用程式中只有一個實例存在,並提供一個全域存取點讓其它程式碼能夠方便地使用該實例。Singleton 模式的主要特點包括:

  • 唯一性:確保類別在系統中只有一個實例存在,避免多實例可能造成的資源競爭與狀態不一致。
  • 全域存取:提供一個靜態方法 (通常命名為 GetInstance 或 Instance),作為全域訪問點,讓任何用戶端程式都能輕易取得該單一實例。
  • 延遲初始化:大多數實現都採用「延遲載入 (lazy loading)」的方式,即在首次需要該實例時才進行初始化,節省系統資源。

Singleton 模式的典型實現包含三個核心元素:私有的靜態實例變數、私有的建構函式以及公有的靜態存取方法。在多執行緒環境中,還需要考慮線程安全問題,通常使用鎖定機制來確保單例的唯一性。

這種模式特別適用於需要統一管理共享資源的情境,如配置管理、連接池控制、日誌系統等。本章後續將介紹的表單編號產生器範例,Singleton 模式可確保產生的編號唯一且連續,避免多個產生器實例可能導致的編號重複問題。

Singleton 模式的效果、應用時機與其它案例

效果

  • 確保唯一性,避免多實例引起衝突的問題。
  • 提供全域存取點,簡化使用。
  • 延遲初始化,節省系統資源。
  • 維護全域狀態一致性。

應用時機

  • 共享資源管理(如資料庫連接池)。
  • 全域狀態統一控制(如配置管理)。
  • 資源有限場景(如硬體設備管理)。
  • 操作協調控制(如交易處理流程)。

其它應用案例

  • 應用程式配置管理。
  • 資料庫連接池。
  • 系統日誌記錄。
  • 視窗管理系統。
  • 線程池管理。

留下第一條留言