設計模式是軟件開發中經驗的結晶,為解決特定上下文中的重複問題提供了經驗證的解決方案。GoF(四人組)在《設計模式:可復用面向對象軟件的基礎》中歸納了 23 種經典模式,分為創建型、結構型、行為型三大類。配合 SOLID 等 7 大設計原則,能指導我們編寫高內聚、低耦合、易擴展的代碼。
核心關注點:如何優雅地創建對象? 將實例化邏輯封裝,解耦客戶代碼與具體類。
| 模式 | 核心意圖 | 適用場景 |
|---|---|---|
| 抽象工廠 | 創建相關/依賴對象家族,無需指定具體類 | 系統需支持多個產品族,如不同皮膚主題的 UI 組件庫 |
| 建造者 | 分步構建複雜對象,將構建與表示分離 | 對象構建過程複雜,參數多、順序敏感(如 HTTP 請求構建器) |
| 工廠方法 | 定義創建接口,由子類決定實例化哪個類 | 框架預留擴展點,如日誌框架的 Logger 創建 |
| 原型 | 通過複製現有實例創建新對象,避免昂貴創建過程 | 初始化開銷大,且狀態相似的對象批量創建 |
| 單例 | 確保類全局僅有一實例,提供全局訪問點 | 配置管理器、連接池、緩存管理器等全局唯一資源 |
核心關注點:如何通過組合實現更靈活的結構?
| 模式 | 核心意圖 | 關鍵點 |
|---|---|---|
| 適配器 | 將接口轉換為客戶期望的另一接口 | 對象適配器用組合,類適配器用多重繼承 |
| 橋接 | 將抽象與實現分離,使二者可獨立變化 | 雙維度變化時替代繼承爆炸,如形狀×顏色 |
| 組合 | 將對象組成樹形結構表現「整體/部分」層次 | 客戶統一處理單個對象與組合對象,如文件系統 |
| 裝飾者 | 動態附加職責,提供比繼承更彈性的擴展 | Java I/O 流體系經典應用 |
| 外觀 | 為子系統提供統一高層接口,降低耦合 | 簡化複雜子系統調用,如醫院掛號統一窗口 |
| 享元 | 共享細粒度對象,減少內存佔用 | 大量相似對象,如文本編輯器字符對象 |
| 代理 | 為對象提供替身控制訪問 | 靜態/動態代理,Spring AOP 底層機制 |
核心關注點:對象如何協作完成任務?
| 模式 | 核心意圖 | 典型應用 |
|---|---|---|
| 責任鏈 | 請求沿處理者鏈傳遞,各節點可處理或轉發 | Servlet Filter 鏈、日誌級別過濾 |
| 命令 | 將請求封裝為對象,支持排隊、日誌、撤銷 | GUI 菜單、事務管理、宏命令 |
| 解釋器 | 為語言定義文法並構建解釋器 | 正則表達式引擎、SQL 解析器 |
| 迭代器 | 順序訪問聚合對象元素,不暴露內部結構 | Java Collection 框架核心 |
| 中介者 | 集中管理對象間複雜通信 | MVC 控制器、聊天室服務器 |
| 備忘錄 | 捕獲對象內部狀態以便後續恢復 | 編輯器撤銷、遊戲存檔 |
| 觀察者 | 定義一對多依賴,狀態變更自動通知 | 事件監聽、消息隊列、Spring 事件機制 |
| 狀態 | 對象內部狀態改變時行為隨之改變 | 訂單狀態流轉、TCP 連接狀態 |
| 策略 | 定義算法族並封裝,使其可互換 | 支付方式、排序算法、壓縮策略 |
| 模板方法 | 定義算法骨架,延遲步驟到子類實現 | JDBC 模板、Servlet 生命周期 |
| 訪問者 | 在不修改類的前提下為對象結構添加操作 | 編譯器 AST 遍歷、報表導出 |
熟練掌握 23 種模式與 7 大原則,能顯著提升代碼質量與系統可維護性,是進階架構師的必修內功。