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

Java 23 種設計模式全景指南:從原理到實戰的完整圖譜

     編輯:Java 相關知識

設計模式是軟件工程的基石,是代碼復用、系統解耦、架構演進的核心武器庫。本文系統梳理 GoF 23 種經典設計模式,涵蓋創建型、結構型、行為型三大類別,輔以六大設計原則、UML 關係圖、完整 Java 實現代碼與應用場景分析,助你構建企業級開發的模式思維。


一、設計模式六大核心原則(SOLID+)

原則核心思想關鍵詞
開閉原則 (OCP)對擴展開放,對修改關閉熱插拔、接口/抽象類
里氏替換原則 (LSP)子類必須能替換父類而不破壞功能繼承復用基石、抽象化具體步驟
依賴倒置原則 (DIP)依賴抽象不依賴具體面向接口編程、IOC 容器基礎
接口隔離原則 (ISP)多個專用接口優於單一臃腫接口降低耦合、單一職責
迪米特法則 (LoD)最少知識原則,實體間盡量少交互模塊獨立、降低依賴
合成復用原則 (CRP)優先組合/聚合,少用繼承靈活復用、避免繼承爆炸

二、創建型模式(5 種)— 解決「如何創建對象」

1. 工廠方法模式 — 三種演進形態

  • 簡單工廠:單一工廠類根據參數創建實例,違反 OCP
  • 多個工廠方法:提供多個創建方法,避免參數錯誤
  • 靜態工廠方法:方法靜態化,無需實例化工廠,**最推薦**
// 靜態工廠最佳實踐
public class SendFactory {
    public static Sender produceMail() { return new MailSender(); }
    public static Sender produceSms() { return new SmsSender(); }
}
// 使用:Sender sender = SendFactory.produceMail();

2. 抽象工廠模式 — 工廠的工廠

引入 Provider 接口,每種產品對應一個工廠實現,**新增產品只需新增工廠類,零修改現有代碼**,完美遵循 OCP。

3. 單例模式 — 線程安全的演進之路

從懶漢式 → 同步鎖 → 雙重檢查鎖 (DCL) → 靜態內部類 → 枚舉單例:

// 靜態內部類:JVM 保證線程安全 + 延遲加載 + 效能最優
public class Singleton {
    private Singleton() {}
    private static class Holder { static final Singleton INSTANCE = new Singleton(); }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

關鍵點:防反序列化破壞(實現 readResolve)、構造器拋異常處理、與靜態類的區別(可繼承、可實現接口、延遲加載)。

4. 建造者模式 — 複雜對象分步構建

關注「復合對象」構建,將構建邏輯封裝在 Builder 中,適用於參數多、順序敏感、不可變對象構建。

5. 原型模式 — Cloneable 與深/淺拷貝

  • 淺拷貝:基本類型重新創建,引用類型共享原對象
  • 深拷貝:序列化/反序列化實現完全隔離的新對象
// 深拷貝標準實現
public Object deepClone() throws IOException, ClassNotFoundException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(this);
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    return new ObjectInputStream(bis).readObject();
}

三、結構型模式(7 種)— 解決「類/對象如何組合」

6. 適配器模式 — 三種適配策略

類型核心機制適用場景
類適配器繼承 Source + 實現 Target單繼承限制,適配單一類
對象適配器組合 Source 實例 + 實現 Target靈活適配多個對象,推薦
接口適配器抽象類實現接口所有方法為空接口方法過多,只需實現部分

7. 裝飾器模式 — 動態擴展職責

裝飾對象持有被裝飾對象引用,**同一接口、靜態組合、可疊加**,解決繼承靜態、爆炸問題。

8. 代理模式 — 控制訪問的中介

代理持有真實對象,**前置/後置增強**,實現 AOP 核心思想。Spring AOP 底層即動態代理實現。

9. 外觀模式 — 子系統的統一入口

Computer 封裝 CPU/Memory/Disk,**降低客戶端與子系統耦合**,類似 Spring 容器統一管理 Bean。

10. 橋接模式 — 抽象與實現分離

JDBC DriverManager 經典案例:**抽象接口 + 多種實現 + 橋接類持有實現引用**,實現運行時動態切換數據庫。

11. 組合模式 — 樹形結構統一處理

TreeNode 遞歸持有子節點,**葉子/容器統一接口**,適用於文件系統、組織架構、菜單樹。

12. 享元模式 — 對象池共享記憶體

數據庫連接池核心思想:**內部狀態共享 + 外部狀態參數化**,FlyweightFactory 管理對象池,大幅減少實例數量。


四、行為型模式(11 種)— 解決「對象間如何交互/職責分配」

13. 策略模式 — 算法族封裝與熱插拔

ICalculator 定義統一接口,Plus/Minus/Multiply 實現具體算法,**客戶端動態選擇策略**,適用於支付方式、排序算法、壓縮策略。

14. 模板方法模式 — 算法骨架固定,細節延遲到子類

抽象類定義 final 模板方法調用抽象步驟,**子類只需實現變化點**,經典案例:HttpServlet.service() → doGet/doPost。

15. 觀察者模式 — 發布訂閱解耦

Subject 維護 Observer 列表,**狀態變更自動通知所有觀察者**,RSS 訂閱、事件總線、監聽器模式核心實現。

16. 迭代器模式 — 統一遍歷接口

Collection 提供 iterator(),**封裝遍歷邏輯**,客戶端無需關心底層數據結構(數組/鏈表/樹)。

17. 責任鏈模式 — 請求傳遞鏈式處理

Handler 持有下一個 Handler,**請求在鏈上流轉直到被處理**,適用於過濾器鏈、審批流程、異常處理鏈。

18. 命令模式 — 請求對象化

Invoker 持有 Command,Command 持有 Receiver,**請求發送者與執行者完全解耦**,支援撤銷/重做、隊列/日誌記錄、Struts Action 核心思想。

19. 備忘錄模式 — 狀態快照與恢復

Originator 創建 Memento,Caretaker 保存 Memento,**封裝內部狀態、不破壞封裝性**,適用於撤銷操作、事務回滾、遊戲存檔。

20. 狀態模式 — 狀態驅動行為切換

Context 持有 State,**狀態改變即行為改變**,QQ 在線/隱身/忙碌、訂單狀態機、工作流引擎核心模式。

21. 訪問者模式 — 數據結構與操作分離

Visitor 定義 visit(),Element 定義 accept(),**新增操作不修改數據結構**,適用於編譯器 AST 遍歷、報表導出多格式。

22. 中介者模式 — 多對多解耦為一對多

Mediator 統一管理 Colleague 交互,**對象間不直接引用**,類似機場塔台指揮、MVC 中 Controller、消息總線。

23. 解釋器模式 — 領域特定語言解析

Expression 定義 interpret(),**遞歸組合終結符/非終結符**,適用於正則引擎、SQL 解析、規則引擎、計算器表達式求值。


五、模式選型決策樹

  1. 需要控制對象創建?→ 創建型(單例/工廠/建造者/原型)
  2. 需要組織類/對象結構?→ 結構型(適配器/裝飾器/代理/外觀/橋接/組合/享元)
  3. 需要分配職責/定義交互?→ 行為型(策略/模板/觀察者/迭代器/責任鏈/命令/備忘錄/狀態/訪問者/中介者/解釋器)

六、資源與參考

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved