設計模式是解決軟件設計中常見問題的經典方案。根據《設計模式:可復用面向對象軟件的基礎》(GoF),23種設計模式分為以下三類:
一、創建型模式(5種)
目標:解耦對象的創建過程,提高系統靈活性
模式名稱 | 核心思想 | 典型應用場景 |
---|---|---|
工廠方法 | 定義創建對象的接口,子類決定實例化哪個類 | 數據庫連接器、日志記錄器 |
抽象工廠 | 創建相關或依賴對象的家族,不指定具體類 | GUI組件庫、跨平臺系統適配 |
建造者 | 分步構建復雜對象,分離構造與表示 | XML解析器、游戲角色生成器 |
原型 | 通過克隆現有對象來創建新對象 | 對象初始化成本高時的復制操作 |
單例 | 確保類只有一個實例,提供全局訪問點 | 配置管理器、線程池、緩存系統 |
二、結構型模式(7種)
目標:組合類或對象形成更大的結構
模式名稱 | 核心思想 | 典型應用場景 |
---|---|---|
適配器 | 轉換接口使不兼容類協同工作 | 舊系統集成、第三方庫封裝 |
橋接 | 分離抽象與實現,允許獨立變化 | 跨平臺繪圖引擎、設備驅動程序 |
組合 | 以樹形結構處理整體-部分關系 | 文件系統、GUI容器控件 |
裝飾器 | 動態添加職責,替代繼承擴展功能 | IO流增強、游戲裝備系統 |
外觀 | 為復雜子系統提供統一的高層接口 | API網關、框架入口類 |
享元 | 共享細粒度對象,減少內存消耗 | 文字編輯器字符對象、棋牌游戲棋子 |
代理 | 為其他對象提供訪問代理,控制訪問 | 遠程調用、虛擬文件系統、權限控制 |
三、行為型模式(11種)
目標:優化對象間的通信與職責分配
模式名稱 | 核心思想 | 典型應用場景 |
---|---|---|
責任鏈 | 將請求沿處理鏈傳遞,直到被處理 | 審批流程、異常處理機制 |
命令 | 封裝請求為對象,支持撤銷/重做操作 | 事務系統、GUI操作歷史記錄 |
解釋器 | 定義語法的表示與解釋方式 | 正則表達式引擎、SQL解析器 |
迭代器 | 提供順序訪問集合元素的方法 | 集合遍歷、樹形結構遍歷 |
中介者 | 通過中介對象封裝對象間交互 | 聊天室系統、空中交通管制系統 |
備忘錄 | 捕獲并保存對象內部狀態,支持狀態回滾 | 文檔版本控制、游戲存檔系統 |
觀察者 | 定義對象間的一對多依賴關系(事件驅動) | 股票行情通知、GUI事件處理 |
狀態 | 封裝狀態相關行為,允許運行時狀態切換 | 訂單狀態機、游戲角色狀態管理 |
策略 | 定義算法族,使其可互相替換 | 支付方式選擇、排序算法切換 |
模板方法 | 定義算法骨架,子類重寫特定步驟 | 框架擴展點、業務流程標準化 |
訪問者 | 在不修改類的前提下為類添加新操作 | 編譯器語法樹分析、報表生成器 |
四、模式選擇指南
-
創建型場景
- 需要靈活控制對象創建過程 → 工廠/建造者模式
- 全局唯一訪問點 → 單例模式
- 復雜對象復制 → 原型模式
-
結構型場景
- 接口不兼容 → 適配器模式
- 動態功能擴展 → 裝飾器模式
- 資源優化 → 享元模式
-
行為型場景
- 事件驅動系統 → 觀察者模式
- 算法切換 → 策略模式
- 狀態管理 → 狀態模式
- 操作記錄 → 命令模式
五、經典模式對比
對比維度 | 工廠方法 vs 抽象工廠 | 裝飾器 vs 代理 | 策略 vs 狀態 |
---|---|---|---|
核心區別 | 生產單個對象 vs 對象家族 | 增強功能 vs 控制訪問 | 算法替換 vs 狀態驅動行為變化 |
擴展方向 | 垂直擴展(子類化) | 橫向擴展(功能疊加) | 算法擴展 vs 狀態擴展 |
典型場景 | 單一產品創建 vs 跨平臺UI組件庫 | IO流增強 vs 遠程服務代理 | 支付方式選擇 vs 訂單狀態機 |
六、實際應用建議
-
避免過度設計
- 優先解決實際問題,而非強制使用模式
- 簡單if-else能解決的不要用策略模式
-
模式組合使用
- 工廠方法+原型:高效創建復雜對象
- 觀察者+命令:實現事件驅動的撤銷操作
-
框架集成
- Spring:工廠模式(BeanFactory)
- React:觀察者模式(State更新)
- Node.js:中間件模式(責任鏈變體)
掌握設計模式的關鍵在于理解其本質思想,而非機械套用。建議結合具體項目實踐,從簡單模式(如策略、觀察者)開始逐步深入,最終達到"無招勝有招"的設計境界。