---
title: "單例和靜態類"
date: "2026-03"
category: "設計模式與架構"
tags: ["設計模式與架構"]
description: "目前來看靜態建構函式就是比較好的辦法了，單例和基類的操作目前有點用不太到，畢竟也沒什麼共享的變動資料，基類的話，只有一個服務，強行去寫反而有點過度設計..."
source: "https://enriquemark.com/zh-hant/posts/%E5%8D%95%E4%BE%8B%E5%92%8C%E9%9D%99%E6%80%81%E7%B1%BB"
---

目前來看靜態建構函式就是比較好的辦法了，單例和基類的操作目前有點用不太到，畢竟也沒什麼共享的變動資料，基類的話，只有一個服務，強行去寫反而有點過度設計。綜合來看，下週的最佳化方向就是靜態建構函式的方式。不過寫基類以後有機會可以試試看，往裡面放那些會複用的方法或者屬性，讓多次使用的時候子類直接繼承就可以免去重寫。但前提是真的有複用，不然就是過度設計了。

單例和靜態類最大的區別就是，前者仍然是一個類，封裝、繼承、多型的特性都在；但後者就真是純粹的方法了，只是上面套了個class的皮。靜態本身就意味著從定義開始就不可變動，其內容必須是固定的，那就別說什麼繼承和更改這種。  
關於封裝這裡，看上去包在類裡像是有封裝，但本質上裡面的靜態變數是整個程式的全局變數。而類就不一樣了，類的例項單獨處理自身作用域內的變數，而每次new出來的都是初始化內容。當然單例就比較特殊，這算是恰巧差不多了，但拿來處理當下的情況正合適。

靜態最大的問題就是有靜態依賴：如果一個地方用了靜態，那就相當於構建了一個隱藏的全局依賴——只要一改，牽一髮動全身。這就是為啥靜態的最佳使用場景是字面意義上的「靜態」時刻，比如單個使用的工具方法，或者是真的需要全局維持一致的靜態變數。一旦動態物件依賴了靜態物件，那這就會成為一個瓶頸，也會成為耦合的來源。比如十個動態物件都依賴於這個靜態時，靜態一動就全完——如果有個變數是可變的狀態，那就不要用靜態。除

非是隻讀的，或者說是希望不例項化就直接呼叫的工具方法（而且也得無狀態，否則如果這個函式也以來一個可變靜態，那就還是帶上了靜態依賴）。濫用靜態的問題會很嚴重，使用之前一定要考慮副作用。比如DI，在沒必要用靜態的地方就可以不用，否則把靜態變數當DI的做法完全是壞味道。DI本來就是為了去耦合，結果又上個注入的靜態物件給耦合上了，這是搞毛線。
