| 類別 | 模式 (共 23 種) | 核心意圖 |
|---|---|---|
| 創建型 (5) | 工廠方法 | 定義創建介面,子類決定實例化哪個類 |
| 抽象工廠 | 創建相關/依賴物件家族,無需指定具體類 | |
| 單例 | 確保類僅一實例,提供全域存取點 | |
| 建造者 | 分步驟構建複雜物件,分離構建與表示 | |
| 原型 | 複製現有實例創建新物件,避免繁瑣初始化 | |
| 結構型 (7) | 適配器 | 將介面轉換為客戶期望的另一介面 |
| 裝飾器 | 動態給物件添加職責,靈活替代繼承 | |
| 代理 | 為其他物件提供代理,控制存取 | |
| 外觀 | 提供統一高層介面,降低子系統耦合 | |
| 橋接 | 抽象與實現分離,兩者可獨立變化 | |
| 組合 | 樹形結構統一單一/組合物件操作 | |
| 享元 | 共享細粒度物件,減少記憶體開銷 | |
| 行為型 (11) | 策略 | 定義算法族,封裝互換,客戶端選擇 |
| 模板方法 | 定義算法骨架,延遲步驟到子類 | |
| 觀察者 | 一對多依賴,狀態變更自動通知 | |
| 迭代器 | 順序存取聚合元素,不暴露內部結構 | |
| 責任鏈 | 請求沿鏈傳遞,自動尋找處理者 | |
| 命令 | 將請求封裝為物件,支援撤銷/佇列 | |
| 備忘錄 | 捕獲物件內部狀態,支援恢復 | |
| 狀態 | 狀態變更改變行為,物件似修改類別 | |
| 訪問者 | 分離數據結構與操作,易添加新操作 | |
| 中介者 | 封裝物件互動,降低多對多耦合 | |
| 解釋器 | 定義語言文法與解釋器 |
// 最終推薦:靜態內部類 (延遲載入 + 線程安全 + 簡潔)
public class Singleton {
private Singleton() {}
private static class Holder { static final Singleton INSTANCE = new Singleton(); }
public static Singleton getInstance() { return Holder.INSTANCE; }
}
關鍵點:JVM 類載入機制保證線程安全、final 保證不可變、首次呼叫才初始化。
SenderFactory.produceMail())Provider.produce() + 多個具體工廠)HandlerInterceptorAdapter)| 維度 | 裝飾器 | 代理 |
|---|---|---|
| 意圖 | **增強**功能 (添加行為) | **控制**存取 (延遲/保護/遠程) |
| 關係 | 持有被裝飾者引用,介面相同 | 持有真實主體引用,介面相同 |
| 建立 | 客戶端層層包裝 | 通常由框架/工廠建立 |
Java 內建 Observable/Observer 已棄用。推薦:
ApplicationEventPublisher + @EventListenerObservable/Flowable (背壓、操作子豐富)EventBus (輕量進程內)// 介面定義算法
interface Calculator { int calc(int a, int b); }
// 具體策略
class Add implements Calculator { public int calc(int a, int b) { return a + b; } }
class Multiply implements Calculator { public int calc(int a, int b) { return a * b; } }
// Context 使用
class Context {
private Calculator strategy;
public Context(Calculator strategy) { this.strategy = strategy; }
public int execute(int a, int b) { return strategy.calc(a, b); }
}
abstract class AbstractCalculator {
// 模板方法 final 防止覆寫
public final int calculate(String exp, String opt) {
int[] nums = split(exp, opt);
return doCalculate(nums[0], nums[1]); // 延遲到子類
}
protected abstract int doCalculate(int a, int b);
private int[] split(String exp, String opt) { /* ... */ }
}
UserBuilder, OrderProxy) 利團隊溝通