首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 23 種設計模式全解析:創建型、結構型、行為型模式原理與代碼實戰

     編輯:Java 綜合教學

Java 23 種設計模式全解析:從原理到落地

設計模式是軟件工程的基石,是代碼設計經驗的總結。合理應用可實現代碼復用、降低耦合、提升可維護性。本文系統梳理 23 種經典模式,結合六大設計原則,提供核心代碼骨架與應用場景。

一、六大設計原則速覽

  1. 開閉原則 (OCP):對擴展開放,對修改關閉。靠抽象/接口實現熱插拔。
  2. 裡氏代換原則 (LSP):子類必須能替換父類出現的所有場合,是繼承復用的基石。
  3. 依賴倒轉原則 (DIP):面向接口編程,依賴抽象而非具體實現。
  4. 接口隔離原則 (ISP):多個專用接口優於單一臃腫接口,降低耦合。
  5. 迪米特法則 (LoD):最少知道原則,實體間盡量少交互,模塊獨立。
  6. 合成復用原則 (CRP):優先組合/聚合,少用繼承。

二、創建型模式(5 種)

1. 工廠方法模式

  • 普通工廠:一個工廠類根據參數創建實現同一接口的多個產品。缺點:參數錯誤無法創建,違反 OCP。
  • 多工廠方法:每個產品對應一個工廠方法,消除參數判斷。
  • 靜態工廠方法:方法置為 static,無需實例化工廠,最常用。

2. 抽象工廠模式

引入工廠接口,每個具體工廠創建一族相關產品。新增產品族只需添加工廠實現,完全符合 OCP。

3. 單例模式

保證 JVM 中唯一實例。演進路線:

  1. 餓漢式(類加載即創建,線程安全)。
  2. 懶漢式 + synchronized(性能差)。
  3. 雙重檢查鎖 (DCL) + volatile(防止指令重排序)。
  4. 靜態內部類(推薦:利用類加載機制天然線程安全、延遲初始化、代碼簡潔)。
  5. 枚舉單例(防反射/序列化破壞,Effective Java 推薦)。

4. 建造者模式

將復雜對象構建過程與表示分離,適用於「多部件組合對象」(如 StringBuilder、HttpClient 構建器)。

5. 原型模式

通過 clone() 複製對象。區分:

  • 淺拷貝:基本類型復制,引用類型共享對象。
  • 深拷貝:引用類型也遞歸復制(可用序列化反序列化實現)。

三、結構型模式(7 種)

6. 適配器模式

  • 類適配器:繼承源類 + 實現目標接口。
  • 對象適配器:組合源類實例 + 實現目標接口(推薦,符合 CRP)。
  • 接口適配器:提供抽象類默認實現所有接口方法,子類只覆寫所需方法。

7. 裝飾器模式

動態給對象添加職責,裝飾器與被裝飾者實現同一接口,構造器注入被裝飾對象。優於繼承:靈活、可動態撤銷。缺點:產生大量小對象,調試困難。

8. 代理模式

為目標對象提供代理,控制訪問(如延遲加載、權限檢查、AOP)。靜態代理/動態代理(JDK/CGLIB)。

9. 外觀模式

為子系統提供統一高層接口,降低客戶端與子系統耦合(如 Spring 的 ApplicationContext、電腦啟動類)。

10. 橋接模式

將抽象與實現分離,兩者可獨立變化(如 JDBC DriverManager、消息發送平台/具體發送渠道)。

11. 組合模式

樹形結構的「部分-整體」層次,統一葉子與容器接口(如文件系統、組織架構、GUI 組件樹)。

12. 享元模式

共享細粒度對象,區分內部狀態(共享)與外部狀態(客戶端傳入)。典型:數據庫連接池、線程池、String 常量池。

四、行為型模式(11 種)

13. 策略模式

定義算法族,封裝每個算法,使其可互換(如支付渠道、排序算法、計算器操作)。

14. 模板方法模式

父類定義算法骨架,子類實現具體步驟(如數據導入流程:讀取→校驗→轉換→持久化)。

15. 觀察者模式

發布-訂閱,一對多依賴,狀態變更自動通知(如事件總線、RSS 訂閱、Spring ApplicationEvent)。

16. 迭代器模式

統一遍歷聚合對象接口,隱藏內部結構(Java Collection 框架核心)。

17. 責任鏈模式

請求沿鏈路傳遞,由某節點處理(如 Servlet Filter、Spring Interceptor、日誌級別過濾)。

18. 命令模式

將請求封裝為對象,解耦調用者與執行者(如線程池任務、GUI 按鈕動作、Struts Action)。

19. 備忘錄模式

捕獲對象內部狀態並外部化存儲,支持撤銷/恢復(如編輯器撤銷、事務回滾、游戲存檔)。

20. 狀態模式

對象行為隨狀態改變而改變,將狀態相關邏輯分散到狀態類中(如訂單狀態機、TCP 連接狀態、QQ 在線/隱身/忙碌)。

21. 訪問者模式

分離數據結構與操作,適合「數據結構穩定、操作易變」場景(如編譯器 AST 遍歷、報表導出多種格式)。缺點:新增數據結構困難。

22. 中介者模式

引入中介者封裝對象間交互,降低耦合(如 MVC 中的 Controller、機場調度塔、Spring 容器)。

23. 解釋器模式

為語言定義文法並構建解釋器(如正則表達式引擎、SQL 解析器、表達式計算器)。應用面窄,但領域內不可替代。

五、學習建議

  1. 先理解六大原則,再對照模式思考「解決什麼問題、怎麼解決、權衡什麼」。
  2. 手寫核心代碼骨架,體會結構差異(如策略 vs 模板、代理 vs 裝飾)。
  3. 掃描 JDK/框架源碼尋找模式身影(Collections.sort 策略、InputStream 裝飾、ThreadPoolExecutor 工廠/命令)。
  4. 實戰中「不要為模式而模式」,YAGNI 原則:需求驅動重構引入模式。
資源下載:23種模式Java實現源碼 | 企業級實戰項目:帶源碼項目
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved