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

Java 23 種設計模式全解析:創建型、結構型、行為型完整指南(含六大原則與代碼範例)

     編輯:Java 綜合教學

前言

設計模式是軟體工程的基石,本文系統梳理 GoF 23 種模式,按創建型(5)、結構型(7)、行為型(11)分類,結合六大設計原則、UML 關係圖、Java 實戰代碼,幫助從原理到落地全面掌握。

一、六大設計原則(核心思想)

原則核心定義指導意義
開閉原則 (OCP)對擴展開放,對修改關閉熱插拔、降低維護風險
裡氏替換 (LSP)子類必須能替換父類不影響功能規範繼承關係,保證多態正確
依賴倒轉 (DIP)依賴抽象不依賴具體解耦,利於測試與替換
介面隔離 (ISP)多個專用介面優於單一臃腫介面降低耦合,避免強制實現無用方法
迪米特法則 (LoD)最少知識,僅與直接朋友通訊降低類間依賴,模組獨立
合成復用 (CRP)優先組合/聚合,少用繼承靈活復用,避免繼承破壞封裝

二、創建型模式 (5) —— 對象實例化的封裝與靈活控制

1. 單例模式 —— 保證全局唯一實例

核心:私有構造器 + 靜態工廠方法 + 雙重檢查鎖 / 靜態內部類 / 枚舉。

// 推薦:靜態內部類(線程安全、延遲加載、無鎖效能)
public class Singleton {
    private Singleton() {}
    private static class Holder { static final Singleton INSTANCE = new Singleton(); }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

應用:配置管理、連接池、日誌器。

2. 工廠方法 —— 定義創建介面,子類決定實例化類別

interface Sender { void send(); }
class MailSender implements Sender { ... }
class SmsSender implements Sender { ... }
interface Factory { Sender create(); }
class MailFactory implements Factory { public Sender create() { return new MailSender(); } }

變體:簡單工廠(非 GoF、違反 OCP)、多工廠方法、靜態工廠方法。

3. 抽象工廠 —— 創建相關/依賴對象族,無需指定具體類

新增產品族只需新增工廠實現,符合 OCP。典型:GUI 工廠(Win/Mac 按鈕+視窗)、數據庫驅動。

4. 建造者 —— 分步構建複雜對象,分離構建與表示

User user = new User.Builder()
    .name("Tom").age(25).email("t@x.com").build();

區別:工廠造「單個產品」,建造者造「復合對象」(多部件、多步驟)。

5. 原型 —— 用 clone() 複製現有對象,避免 new 開銷

淺拷貝:引用類型共享;深拷貝:序列化/遞歸複製。實現 Cloneable、重寫 clone()。

三、結構型模式 (7) —— 類/對象組合與介面適配

6. 適配器 —— 將不兼容介面轉換為客戶期望介面

  • 類適配器:繼承 Adaptee + 實現 Target(單繼承限制)。
  • 對象適配器:組合 Adaptee 實例(推薦,靈活)。
  • 介面適配器:抽象類實現介面所有方法為空,子類只覆寫需要的。

7. 裝飾器 —— 動態給對象添加職責,替代繼承

Component c = new ConcreteComponent();
c = new DecoratorA(c);
c = new DecoratorB(c);
c.operation(); // A -> B -> core

關鍵:裝飾器與被裝飾者實現同一介面,持有被裝飾者引用。

8. 代理 —— 為對象提供代理,控制訪問

  • 靜態代理:手寫代理類。
  • 動態代理:JDK Proxy(介面)、CGLIB(繼承)。Spring AOP 底層即此。

9. 外觀 —— 為子系統提供統一高層介面,降低耦合

如 ComputerFacade 封裝 CPU、Memory、Disk 啟動流程。

10. 橋接 —— 將抽象與實現分離,兩者可獨立變化

JDBC:DriverManager(抽象)+ 各廠商 Driver(實現)。

11. 組合 —— 樹形結構:部分-整體層次,統一葉子與容器操作

文件系統、GUI 控件樹、組織架構。

12. 享元 —— 共享細粒度對象,減少內存開銷

內部狀態共享、外部狀態傳入。典型:連接池、字符對象、棋子。

四、行為型模式 (11) —— 對象間職責分配與通訊

13. 策略 —— 定義算法族,封裝並可互換

如支付策略、排序策略、計價策略。Context 持有 Strategy 介面。

14. 模板方法 —— 定義算法骨架,子類實現具體步驟

abstract class Template {
    final void execute() { step1(); step2(); hook(); }
    abstract void step1(); abstract void step2();
    void hook() {} // 鉤子方法
}

15. 觀察者 —— 一對多依賴,狀態變更自動通知

Subject 維護 Observer 列表,notify() 遍歷調用 update()。Java 內置 java.util.Observable(已棄用),常用 Guava EventBus / Spring Event。

16. 迭代器 —— 統一遍歷聚合對象,隱藏內部結構

Collection → Iterator,hasNext()/next()。

17. 責任鏈 —— 請求沿鏈傳遞,由某節點處理

如 Servlet Filter、Log4j Logger、Spring Interceptor。節點持有 next 引用。

18. 命令 —— 將請求封裝為對象,支援撤銷/排隊/日誌

Invoker → Command → Receiver。Struts Action、線程池任務均屬此類。

19. 備忘錄 —— 捕獲對象內部狀態,支援恢復

Originator 創建 Memento,Caretaker 保存。編輯器撤銷、遊戲存檔。

20. 狀態 —— 對象行為隨內部狀態改變而改變

Context 委派給 State 介面實現。訂單狀態機、TCP 連接狀態。

21. 訪問者 —— 分離數據結構與操作,易添加新操作

Element.accept(Visitor) → Visitor.visit(Element)。編譯器 AST 遍歷、報表導出。

22. 中介者 —— 封裝對象間交互,降低耦合

Mediator 統一協調 Colleague。MVC 中 Controller 即中介者。

23. 解釋器 —— 為語言定義文法並解釋句子

正則引擎、SQL 解析器、表達式計算器。適用領域窄但威力大。

五、模式選型速查表

問題推薦模式關鍵詞
需要全局唯一實例Singleton私有構造、靜態工廠
創建邏輯複雜/多步驟Builder鏈式調用、build()
需創建相關對象族Abstract Factory工廠介面、產品族
介面不兼容需轉換Adapter組合/繼承轉換
動態添加職責Decorator同介面、持有引用
控制對象訪問Proxy代理類、AOP
簡化子系統調用Facade統一入口
抽象與實現解耦Bridge兩維度獨立變化
樹形結構統一操作Composite葉子/容器同介面
大量相似對象共享Flyweight內部/外部狀態
算法可互換Strategy策略介面、Context
算法骨架固定、步驟可變Template Methodfinal 模板、抽象步驟
狀態變更通知多方Observer發布/訂閱
統一遍歷方式IteratorhasNext/next
請求鏈式處理Chain of Responsibilitynext 引用
請求對象化、支援撤銷Command封裝調用
狀態快照與恢復MementoOriginator/Caretaker
行為隨狀態變化State狀態介面、Context委派
數據結構穩定、操作易變Visitor雙分派 accept/visit
多對象耦合交互Mediator中心協調
語言文法解析Interpreter終結符/非終結符

六、實戰建議

  1. 先理解原則,再套模式:OCP、DIP、CRP 是判斷「是否過度設計」的標尺。
  2. 命名體現模式:XxxFactory、XxxBuilder、XxxAdapter、XxxDecorator、XxxStrategy,讓代碼自文檔化。
  3. 避免為模式而模式:簡單邏輯用 if/else 或 Map<Type, Strategy> 即可,無需建十幾個類。
  4. 組合優於繼承:Strategy、Decorator、Composite、Proxy 皆體現組合思想。
  5. 熟悉 JDK/Spring 內置應用:Collections.singletonList、Stream API、Spring AOP、BeanFactory、HandlerInterceptor 等皆是模式實戰。

掌握 23 種模式不是背誦結構,而是建立「識別問題 → 選擇原則 → 套用模式 → 權衡取捨」的架構思維。

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