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

Java 開發必懂的 23 種設計模式完整指南

     編輯:Java 相關知識

前言:設計模式是軟件架構的詞彙表

GoF(四人幫)定義的 23 種經典設計模式,是解決特定上下文中反覆出現問題的經驗總結。它們不是現成的代碼庫,而是思維框架。本文系統梳理所有模式的核心意圖、適用場景與關鍵權衡,助你構建可維護、可擴展的 Java 系統。

一、創建型模式(5 種):對象誕生的藝術

模式核心意圖關鍵角色適用場景優點/缺點
工廠方法定義創建對象接口,由子類決定實例化哪個類抽象工廠、具體工廠、抽象產品、具體產品框架預留擴展點、日誌記錄器創建+解耦創建邏輯 -增加類數量
抽象工廠提供創建一族相關對象的接口,無需指定具體類抽象工廠、具體工廠、抽象產品族、具體產品多平台 UI 組件庫、數據庫驅動適配+保證產品族一致性 -擴展產品族困難
建造者將複雜對象構建與表示分離,相同構建過程創建不同表示Director、Builder、ConcreteBuilder、ProductStringBuilder、HttpRequest 構建、複雜 DO 構建+精細控制構建步驟 -產品結構變化需修改 Builder
原型通過複製現有實例創建新對象,而非實例化類Prototype、ConcretePrototype、Client大對象複製、狀態保存恢復、避免昂貴創建開銷+運行時動態增減產品 -每類需實現 clone、深拷貝複雜
單例確保類全局僅一實例,並提供全局訪問點Singleton(私有構造器、靜態實例、靜態工廠方法)配置管理器、連接池、線程池、緩存管理器+受控訪問、懶加載 -測試困難、隱藏依賴、違反 SRP

二、結構型模式(7 種):對象組合的藝術

模式核心意圖關鍵角色適用場景優點/缺點
適配器將接口轉換為客戶期望的另一接口,使不兼容類協同工作Target、Adaptee、Adapter第三方庫集成、舊系統遷移、數據格式轉換+復用現有類 -過度使用增加間接層
橋接將抽象與實現解耦,使兩者可獨立變化Abstraction、RefinedAbstraction、Implementor、ConcreteImplementorJDBC 驅動、跨平台圖形庫、消息發送多渠道+分離抽象/實現 -增加系統複雜度
組合將對象組合成樹結構表示「整體-部分」層次,統一單個/組合對象接口Component、Leaf、Composite文件系統、組織架構、菜單樹、表單組件+簡化客戶代碼 -設計過於泛化
裝飾器動態給對象添加職責,提供比繼承更靈活的擴展方式Component、ConcreteComponent、Decorator、ConcreteDecoratorJava IO 流、Servlet Filter、Spring 事務增強+運行時動態組合 -產生大量小對象
外觀為子系統提供統一高層接口,降低客戶端與子系統耦合Facade、Subsystem Classes服務層聚合、API 網關、簡化複雜框架使用+解耦客戶/子系統 -可能成為上帝類
享元以共享方式高效支持大量細粒度對象Flyweight、FlyweightFactory、UnsharedConcreteFlyweight字符渲染、連接池、線程池、緩存+大幅減少內存 -邏輯複雜、需分離內外狀態
代理為對象提供代理控制訪問,支持延遲加載、權限、日誌等Subject、RealSubject、ProxySpring AOP、RPC 框架、圖片懶加載、訪問控制+職責分離、開閉原則 -增加調用延遲

三、行為型模式(11 種):對象協作的藝術

模式核心意圖關鍵角色適用場景優點/缺點
責任鏈將請求傳遞給鏈上對象,直到某對象處理Handler、ConcreteHandler、ClientServlet Filter、日誌級別過濾、審批流程+解耦發送者/接收者 -調試困難、性能開銷
命令將請求封裝為對象,支持撤銷、隊列、日誌Command、ConcreteCommand、Invoker、ReceiverGUI 菜單、事務管理、異步任務隊列+解耦調用者/執行者 -類膨脹
解釋器定義語言文法表示並提供解釋器AbstractExpression、Terminal/NonterminalExpression、Context正則引擎、SQL 解析、規則引擎、DSL+易擴展文法 -複雜文法類爆炸
迭代器順序訪問聚合對象元素,不暴露內部結構Iterator、ConcreteIterator、Aggregate、ConcreteAggregate集合遍歷、數據庫結果集、樹遍歷+統一遍歷接口 -並發修改風險
中介者封裝對象間交互,將多對多轉為一對多,降低耦合Mediator、ConcreteMediator、ColleagueMVC 控制器、機場調度、聊天室+簡化對象協議 -中介者可能過於複雜
備忘錄捕獲對象內部狀態外部化存儲,支持撤銷恢復Originator、Memento、Caretaker編輯器撤銷、棋局回溯、事務回滾+封裝性好 -狀態大時內存開銷大
觀察者定義一對多依賴,主題變化自動通知觀察者Subject、Observer、ConcreteSubject、ConcreteObserver事件總線、消息隊列、GUI 事件、Spring 事件+解耦主題/觀察者 -循環引用風險、通知風暴
狀態允許對象在內部狀態改變時改變行為,如換類Context、State、ConcreteState訂單狀態機、工作流引擎、遊戲角色狀態+局部化狀態行為 -狀態類增多
策略定義算法族,封裝各算法使可互換Strategy、ConcreteStrategy、Context支付方式、排序算法、壓縮策略、路由算法+算法獨立變化 -客戶端需知曉策略差異
模板方法定義算法骨架,延遲部分步驟到子類實現AbstractClass、ConcreteClass數據導入導出、報表生成、框架鉤子方法+復用邏輯、控制反轉 -逆向控制增加閱讀難度
訪問者分離數據結構與操作,易於添加新操作Visitor、ConcreteVisitor、Element、ConcreteElement、ObjectStructure編譯器 AST 遍歷、報表統計、文檔導出+易添加操作 -破壞封裝、元素類變化困難

四、模式選型決策指南

4.1 按問題域分類

  • 對象創建:單例(全局唯一)、工廠(解耦創建)、建造者(複雜構建)、原型(複製代替 new)
  • 接口適配:適配器(接口不匹配)、外觀(簡化子系統)、橋接(抽象/實現分離)
  • 對象組合:組合(樹結構)、裝飾器(動態增強)、代理(訪問控制)、享元(大量細粒度)
  • 行為協作:觀察者(事件通知)、策略(算法切換)、模板方法(流程固化)、命令(請求對象化)、狀態(狀態驅動行為)、責任鏈(鏈式處理)、中介者(集中協調)、訪問者(操作與結構分離)、迭代器(統一遍歷)、備忘錄(狀態快照)、解釋器(語言解析)

4.2 核心設計原則映射

原則體現模式
單一職責原則 (SRP)所有模式
開閉原則 (OCP)策略、裝飾器、工廠方法、觀察者
里氏替換原則 (LSP)繼承體系設計基石
接口隔離原則 (ISP)適配器、外觀
依賴倒置原則 (DIP)工廠、策略、觀察者、模板方法
合成復用原則 (CARP)組合、裝飾器、代理、橋接
迪米特法則 (LoD)中介者、外觀

五、Java 生態中的模式實踐

  • JDK:Collections.singleton()(單例)、Arrays.asList()(適配器)、Stream(建造者/迭代器)、Proxy(代理)、Comparator(策略)
  • Spring:BeanFactory(工廠)、ApplicationContext(單例註冊表)、AOP(代理/裝飾器)、TransactionTemplate(模板方法)、EventListener(觀察者)
  • Servlet:FilterChain(責任鏈)、DispatcherServlet(前端控制器/外觀)

六、避坑指南:模式不是銀彈

  1. 過度設計:簡單場景硬套模式,增加不必要複雜度
  2. 模式堆砌:一個類同時扮演多種模式角色,職責不清
  3. 忽略語境:脫離具體業務場景談模式優劣
  4. 違反原則:為用模式而犧牲封裝、內聚、低耦合

七、總結

23 種設計模式是軟件工程的寶貴財富,但它們是手段而非目的。真正的高手不僅知其然,更知其所以然,能在具體業務語境中權衡利弊,靈活組合、甚至創造新模式。建議:先掌握核心 7-8 種高頻模式(單例、工廠、策略、觀察者、模板方法、代理、裝飾器、適配器),實戰中反覆練習,再逐步擴展全圖譜。

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