設計模式是軟件工程的基石,是代碼設計經驗的總結。合理應用可實現代碼復用、降低耦合、提升可維護性。本文系統梳理 23 種經典模式,結合六大設計原則,提供核心代碼骨架與應用場景。
引入工廠接口,每個具體工廠創建一族相關產品。新增產品族只需添加工廠實現,完全符合 OCP。
保證 JVM 中唯一實例。演進路線:
將復雜對象構建過程與表示分離,適用於「多部件組合對象」(如 StringBuilder、HttpClient 構建器)。
通過 clone() 複製對象。區分:
動態給對象添加職責,裝飾器與被裝飾者實現同一接口,構造器注入被裝飾對象。優於繼承:靈活、可動態撤銷。缺點:產生大量小對象,調試困難。
為目標對象提供代理,控制訪問(如延遲加載、權限檢查、AOP)。靜態代理/動態代理(JDK/CGLIB)。
為子系統提供統一高層接口,降低客戶端與子系統耦合(如 Spring 的 ApplicationContext、電腦啟動類)。
將抽象與實現分離,兩者可獨立變化(如 JDBC DriverManager、消息發送平台/具體發送渠道)。
樹形結構的「部分-整體」層次,統一葉子與容器接口(如文件系統、組織架構、GUI 組件樹)。
共享細粒度對象,區分內部狀態(共享)與外部狀態(客戶端傳入)。典型:數據庫連接池、線程池、String 常量池。
定義算法族,封裝每個算法,使其可互換(如支付渠道、排序算法、計算器操作)。
父類定義算法骨架,子類實現具體步驟(如數據導入流程:讀取→校驗→轉換→持久化)。
發布-訂閱,一對多依賴,狀態變更自動通知(如事件總線、RSS 訂閱、Spring ApplicationEvent)。
統一遍歷聚合對象接口,隱藏內部結構(Java Collection 框架核心)。
請求沿鏈路傳遞,由某節點處理(如 Servlet Filter、Spring Interceptor、日誌級別過濾)。
將請求封裝為對象,解耦調用者與執行者(如線程池任務、GUI 按鈕動作、Struts Action)。
捕獲對象內部狀態並外部化存儲,支持撤銷/恢復(如編輯器撤銷、事務回滾、游戲存檔)。
對象行為隨狀態改變而改變,將狀態相關邏輯分散到狀態類中(如訂單狀態機、TCP 連接狀態、QQ 在線/隱身/忙碌)。
分離數據結構與操作,適合「數據結構穩定、操作易變」場景(如編譯器 AST 遍歷、報表導出多種格式)。缺點:新增數據結構困難。
引入中介者封裝對象間交互,降低耦合(如 MVC 中的 Controller、機場調度塔、Spring 容器)。
為語言定義文法並構建解釋器(如正則表達式引擎、SQL 解析器、表達式計算器)。應用面窄,但領域內不可替代。
資源下載:23種模式Java實現源碼 | 企業級實戰項目:帶源碼項目