單例 (Singleton)

★★★★Studied

FromDesign Patterns (GoF)大話設計模式Design Patterns Explained

📚 From the Books

單例 (Singleton)ConceptCreational

保證一個類別全程只有一個實例,並提供一個全域存取點。聽起來方便,但它同時偷偷把「全域狀態」和「隱藏依賴」帶進系統,多數情況其實該用 DI 注入單一實例來取代。

🧠 When to Use

TIP

訊號:某資源天生就只能有一份(硬體裝置、作業系統層級的鎖),而且讓多個實例存在會直接出錯——不是「只是懶得傳參數」。

⚖️ Structure & Variants

Kotlin 版 — object 一行搞定
object Config {                 // 編譯器保證執行緒安全的延遲初始化、全程唯一實例
    val maxConn = 10
    fun reload() { /* ... */ }
}

Config.maxConn                  // 全域存取點
  • Kotlin 的 object 直接就是 Singleton,省去手寫 double-checked locking。但「容易寫」不代表「該用」。
Java 經典版 — 為什麼這麼囉嗦
  • 傳統得處理執行緒安全(double-checked locking + volatile)或用 enum / holder idiom,才能保證唯一又不出 race。
  • 這份歷史包袱正提醒:Singleton 的「唯一性保證」其實不便宜,而且和測試替身天生衝突
更好的解 — DI 注入單一實例
  • 把物件交給 依賴注入 容器以 singleton scope 管理:依然是一個實例,但依賴顯式注入、測試時可換 mock。
  • 你得到「全程一份」的好處,卻不用付「全域存取點 + 隱藏依賴」的代價。這幾乎總是優於手寫 Singleton。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading