🎯 什麼情境該想到我
當某個東西整個程式從頭到尾只該存在一份、而且很多地方都要拿到「同一個」它——例如全域設定、連線池、日誌器;或你需要一個統一的協調中心時。
⚙️ 怎麼用(步驟 / 公式)
- 意圖:確保一個類別只有一個實例,並提供一個全域存取點。
- 主要參與者:
Singleton(把建構子設為私有、保存唯一實例、提供靜態getInstance())。 - 做法:私有建構子擋掉外部
new+靜態getInstance()回傳唯一實例。 - 多執行緒要處理同步:可用 eager init(載入時就建好)或 double-checked locking(延遲建立又避免每次都加鎖)確保只會建一份。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 本質上是全域狀態:會造成隱性耦合(誰都能偷偷拿它、依賴關係看不出來)、單元測試難以替換與隔離、並發下若同步沒做好會出錯。
- 能用依賴注入把「唯一實例」從外面傳進來,就別濫用 Singleton——同樣達成「只有一份」,但耦合更低、更好測。
- 常被當成方便的全域變數濫用,是最容易被誤用的設計模式之一。