設計模式入門:23 種模式分類速查與核心場景
設計模式是軟件開發中經驗的結晶,GoF《設計模式》一書定義了 23 種經典模式,分為創建型、結構型、行為型三大類。本文提供清晰的分類表、核心意圖一句話摘要、典型應用場景,幫助快速建立全局認知框架。
一、創建型模式(5 種)— 封裝對象創建過程
| 模式 | 核心意圖 | 典型場景 |
| Singleton(單例) | 保證類只有一個實例,提供全局訪問點 | 配置管理器、連接池、日誌器 |
| Abstract Factory(抽象工廠) | 提供創建一系列相關/依賴對象的接口,無需指定具體類 | 跨平台 UI 庫、數據庫驅動適配 |
| Factory Method(工廠方法) | 定義創建對象接口,由子類決定實例化哪個類 | 文檔解析器、插件系統 |
| Builder(建造者) | 將複雜對象構建與表示分離,同一構建過程可創建不同表示 | HTTP 請求構建、複雜配置對象 |
| Prototype(原型) | 用原型實例指定創建對象種類,通過拷貝創建新對象 | 對象池、撤銷/重做、動態加載類 |
二、結構型模式(7 種)— 處理類/對象組合關係
| 模式 | 核心意圖 | 典型場景 |
| Adapter(適配器) | 將一個類接口轉換為客戶期望的另一接口 | 第三方庫適配、舊系統接口兼容 |
| Bridge(橋接) | 將抽象與實現解耦,使兩者可獨立變化 | 跨平台圖形繪製、驅動程序架構 |
| Composite(組合) | 將對象組合成樹形結構,統一單個/組合對象接口 | 文件系統、GUI 組件樹、菜單系統 |
| Decorator(裝飾器) | 動態給對象添加職責,比繼承更靈活 | IO 流包裝、日誌增強、權限檢查 |
| Facade(外觀) | 為子系統提供統一高層接口,降低耦合 | 編譯器子系統、服務層統一入口 |
| Flyweight(享元) | 共享細粒度對象,減少內存佔用 | 字符渲染、棋子、大量相似對象 |
| Proxy(代理) | 為其他對象提供代理以控制訪問 | 遠程代理、虛擬代理、保護代理、AOP |
三、行為型模式(11 種)— 關注對象間通信與職責分配
| 模式 | 核心意圖 | 典型場景 |
| Chain of Responsibility(職責鏈) | 多個對象有機會處理請求,避免發送者/接收者耦合 | Servlet Filter、異常處理鏈、審批流程 |
| Command(命令) | 將請求封裝為對象,支持參數化、排隊、日誌、撤銷 | GUI 按鈕、事務管理、宏錄製 |
| Interpreter(解釋器) | 定義語言文法表示及解釋器 | SQL 解析、正則引擎、腳本語言 |
| Iterator(迭代器) | 順序訪問聚合對象元素,不暴露內部結構 | STL 迭代器、集合遍歷 |
| Mediator(中介者) | 用中介對象封裝對象交互,降低耦合 | MVC 控制器、聊天室、航管系統 |
| Memento(備忘錄) | 捕獲對象內部狀態,外部化存儲以便恢復 | 編輯器撤銷、遊戲存檔、事務回滾 |
| Observer(觀察者) | 定義一對多依賴,狀態變更自動通知更新 | 事件總線、Model-View 綁定、消息推送 |
| State(狀態) | 對象內部狀態改變時改變行為,如換類 | 訂單狀態機、TCP 連接狀態、遊戲角色 |
| Strategy(策略) | 定義算法族,封裝並可互換,算法獨立於客戶 | 排序算法切換、支付方式、壓縮策略 |
| Template Method(模板方法) | 定義算法骨架,將步驟延遲到子類 | 數據導出流程、測試框架、解析器框架 |
| Visitor(訪問者) | 在不改變元素類前提下定義新操作 | 編譯器 AST 遍歷、報表生成、類型分發 |
四、高頻必會「核心五模式」
- Singleton:全局唯一實例,線程安全實現(雙重檢查鎖/靜態局部變量)。
- Factory Method / Abstract Factory:解耦創建邏輯,框架擴展點核心。
- Observer:事件驅動架構基石,MVC、消息隊列核心。
- Strategy:算法封裝替換,開閉原則典範。
- Decorator / Proxy:AOP、中間件、攔截器實現基礎。
五、學習建議
- 先理解意圖,再看結構:不要死記類圖,先搞清「解決什麼問題」。
- 結合框架源碼:Spring 用 Factory/Proxy/Template/Observer,Java IO 用 Decorator,Servlet 用 Chain of Responsibility。
- 重構中識別:在代碼異味(大量 if-else、重複代碼、強耦合)中嘗試引入模式。
- 避免過度設計:簡單場景用簡單代碼,模式是為了應對變化,不是炫技。
設計模式不是銀彈,但它是經驗的詞彙表。建立「模式詞彙」後,團隊溝通效率將質變:一句「這裡用 Strategy 替換硬編碼」勝過千言萬語。