設計模式是軟體工程的基石,本文系統梳理 GoF 23 種模式,按創建型(5)、結構型(7)、行為型(11)分類,結合六大設計原則、UML 關係圖、Java 實戰代碼,幫助從原理到落地全面掌握。
| 原則 | 核心定義 | 指導意義 |
|---|---|---|
| 開閉原則 (OCP) | 對擴展開放,對修改關閉 | 熱插拔、降低維護風險 |
| 裡氏替換 (LSP) | 子類必須能替換父類不影響功能 | 規範繼承關係,保證多態正確 |
| 依賴倒轉 (DIP) | 依賴抽象不依賴具體 | 解耦,利於測試與替換 |
| 介面隔離 (ISP) | 多個專用介面優於單一臃腫介面 | 降低耦合,避免強制實現無用方法 |
| 迪米特法則 (LoD) | 最少知識,僅與直接朋友通訊 | 降低類間依賴,模組獨立 |
| 合成復用 (CRP) | 優先組合/聚合,少用繼承 | 靈活復用,避免繼承破壞封裝 |
核心:私有構造器 + 靜態工廠方法 + 雙重檢查鎖 / 靜態內部類 / 枚舉。
// 推薦:靜態內部類(線程安全、延遲加載、無鎖效能)
public class Singleton {
private Singleton() {}
private static class Holder { static final Singleton INSTANCE = new Singleton(); }
public static Singleton getInstance() { return Holder.INSTANCE; }
}
應用:配置管理、連接池、日誌器。
interface Sender { void send(); }
class MailSender implements Sender { ... }
class SmsSender implements Sender { ... }
interface Factory { Sender create(); }
class MailFactory implements Factory { public Sender create() { return new MailSender(); } }
變體:簡單工廠(非 GoF、違反 OCP)、多工廠方法、靜態工廠方法。
新增產品族只需新增工廠實現,符合 OCP。典型:GUI 工廠(Win/Mac 按鈕+視窗)、數據庫驅動。
User user = new User.Builder()
.name("Tom").age(25).email("t@x.com").build();
區別:工廠造「單個產品」,建造者造「復合對象」(多部件、多步驟)。
淺拷貝:引用類型共享;深拷貝:序列化/遞歸複製。實現 Cloneable、重寫 clone()。
Component c = new ConcreteComponent(); c = new DecoratorA(c); c = new DecoratorB(c); c.operation(); // A -> B -> core
關鍵:裝飾器與被裝飾者實現同一介面,持有被裝飾者引用。
如 ComputerFacade 封裝 CPU、Memory、Disk 啟動流程。
JDBC:DriverManager(抽象)+ 各廠商 Driver(實現)。
文件系統、GUI 控件樹、組織架構。
內部狀態共享、外部狀態傳入。典型:連接池、字符對象、棋子。
如支付策略、排序策略、計價策略。Context 持有 Strategy 介面。
abstract class Template {
final void execute() { step1(); step2(); hook(); }
abstract void step1(); abstract void step2();
void hook() {} // 鉤子方法
}
Subject 維護 Observer 列表,notify() 遍歷調用 update()。Java 內置 java.util.Observable(已棄用),常用 Guava EventBus / Spring Event。
Collection → Iterator,hasNext()/next()。
如 Servlet Filter、Log4j Logger、Spring Interceptor。節點持有 next 引用。
Invoker → Command → Receiver。Struts Action、線程池任務均屬此類。
Originator 創建 Memento,Caretaker 保存。編輯器撤銷、遊戲存檔。
Context 委派給 State 介面實現。訂單狀態機、TCP 連接狀態。
Element.accept(Visitor) → Visitor.visit(Element)。編譯器 AST 遍歷、報表導出。
Mediator 統一協調 Colleague。MVC 中 Controller 即中介者。
正則引擎、SQL 解析器、表達式計算器。適用領域窄但威力大。
| 問題 | 推薦模式 | 關鍵詞 |
|---|---|---|
| 需要全局唯一實例 | Singleton | 私有構造、靜態工廠 |
| 創建邏輯複雜/多步驟 | Builder | 鏈式調用、build() |
| 需創建相關對象族 | Abstract Factory | 工廠介面、產品族 |
| 介面不兼容需轉換 | Adapter | 組合/繼承轉換 |
| 動態添加職責 | Decorator | 同介面、持有引用 |
| 控制對象訪問 | Proxy | 代理類、AOP |
| 簡化子系統調用 | Facade | 統一入口 |
| 抽象與實現解耦 | Bridge | 兩維度獨立變化 |
| 樹形結構統一操作 | Composite | 葉子/容器同介面 |
| 大量相似對象共享 | Flyweight | 內部/外部狀態 |
| 算法可互換 | Strategy | 策略介面、Context |
| 算法骨架固定、步驟可變 | Template Method | final 模板、抽象步驟 |
| 狀態變更通知多方 | Observer | 發布/訂閱 |
| 統一遍歷方式 | Iterator | hasNext/next |
| 請求鏈式處理 | Chain of Responsibility | next 引用 |
| 請求對象化、支援撤銷 | Command | 封裝調用 |
| 狀態快照與恢復 | Memento | Originator/Caretaker |
| 行為隨狀態變化 | State | 狀態介面、Context委派 |
| 數據結構穩定、操作易變 | Visitor | 雙分派 accept/visit |
| 多對象耦合交互 | Mediator | 中心協調 |
| 語言文法解析 | Interpreter | 終結符/非終結符 |
XxxFactory、XxxBuilder、XxxAdapter、XxxDecorator、XxxStrategy,讓代碼自文檔化。if/else 或 Map<Type, Strategy> 即可,無需建十幾個類。掌握 23 種模式不是背誦結構,而是建立「識別問題 → 選擇原則 → 套用模式 → 權衡取捨」的架構思維。