設計模式是軟件設計中反復出現的解決方案的模板,用于解決特定問題并提高代碼的可維護性、可擴展性和可復用性。23種經典設計模式可分為創建型、結構型和行為型三大類,以下是具體分類及模式概述:
一、創建型模式(5種)
關注對象的創建過程,解耦對象的實例化與使用,提高靈活性。
1.單例模式
- 定義:確保一個類只有一個實例,并提供全局訪問點。
- 應用場景:配置管理、線程池、數據庫連接池等。
- 實現方式:餓漢式、懶漢式、雙重檢查鎖、靜態內部類等。
2.抽象工廠模式
- 定義:創建一系列相關或依賴對象的家族,無需指定具體類。
- 應用場景:跨平臺UI組件庫、數據庫訪問層等。
- 優點:隔離具體類的生成,客戶端與具體產品解耦。
3.工廠方法模式
- 定義:定義一個創建對象的接口,由子類決定實例化哪個類。
- 應用場景:JDBC連接數據庫、日志記錄器等。
- 優點:符合開閉原則,新增產品無需修改原有代碼。
4.建造者模式
- 定義:分步驟構建復雜對象,允許相同的構建過程創建不同表示。
- 應用場景:SQL構建器、JSON解析器等。
- 優點:封裝構建邏輯,便于擴展和復用。
5.原型模式
- 定義:通過復制現有對象創建新對象,避免重復初始化。
- 應用場景:對象創建成本高(如數據庫連接)、緩存系統等。
- 實現方式:淺拷貝(Object.clone())或深拷貝(序列化/反序列化)。
二、結構型模式(7種)
關注類或對象的組合,形成更大的結構,提高靈活性和可擴展性。
1.橋接模式
- 定義:將抽象部分與實現部分分離,使它們可以獨立變化。
- 應用場景:跨平臺圖表庫、驅動框架等。
- 優點:避免繼承導致的類爆炸,提高擴展性。
2.代理模式
- 定義:為其他對象提供代理以控制訪問。
- 應用場景:RPC調用、AOP編程等。
- 類型:靜態代理、動態代理(JDK/CGLIB)。
3.組合模式
- 定義:將對象組合成樹形結構,表示“部分-整體”層次。
- 應用場景:文件系統、GUI組件樹等。
- 優點:統一處理單個對象和組合對象。
4.適配器模式
- 定義:將不兼容的接口轉換為客戶端期望的接口。
- 應用場景:舊系統改造、第三方庫集成等。
- 類型:類適配器(繼承)、對象適配器(組合)。
5.享元模式
- 定義:共享大量細粒度對象,減少內存占用。
- 應用場景:字符串常量池、線程池等。
- 核心:區分內部狀態(共享)和外部狀態(獨立)。
6.裝飾器模式
- 定義:動態添加職責到對象,比繼承更靈活。
- 應用場景:Java I/O流、日志裝飾器等。
- 優點:避免子類膨脹,功能擴展開放。
7.外觀模式
- 定義:為復雜子系統提供簡化接口。
- 應用場景:分布式系統、家庭影院控制等。
- 優點:降低客戶端與子系統的耦合度。
三、行為型模式(11種)
關注對象間的通信和職責分配,提高靈活性和可維護性。
1.訪問者模式
- 定義:將操作作用于對象結構中的元素,支持新操作擴展。
- 應用場景:編譯器語法樹分析、XML解析等。
- 缺點:增加對象結構時需修改所有訪問者。
2.策略模式
- 定義:定義算法族,封裝并使其可互換。
- 應用場景:排序算法、支付方式選擇等。
- 優點:避免條件語句,便于擴展新算法。
3.備忘錄模式
- 定義:捕獲并保存對象狀態,以便后續恢復。
- 應用場景:游戲存檔、文本編輯器撤銷操作等。
- 核心:備忘錄對象(存儲狀態)、原發器(被保存對象)、管理者(管理備忘錄)。
4.觀察者模式
- 定義:定義一對多依賴,主題狀態變化時通知觀察者。
- 應用場景:事件處理、消息訂閱等。
- 實現方式:Java中的Observer接口或自定義事件總線。
5.模板方法模式
- 定義:定義算法骨架,將步驟延遲到子類實現。
- 應用場景:框架設計、單元測試框架等。
- 核心:抽象類定義模板方法,子類實現具體步驟。
6.迭代器模式
- 定義:提供順序訪問聚合對象元素的方法,不暴露內部結構。
- 應用場景:集合遍歷、樹形結構遍歷等。
- 優點:統一訪問接口,支持不同遍歷方式。
7.狀態模式
- 定義:允許對象在內部狀態改變時改變行為。
- 應用場景:訂單狀態機、游戲角色狀態等。
- 優點:避免大量條件語句,符合開閉原則。
8.命令模式
- 定義:將請求封裝為對象,支持參數化、隊列和日志。
- 應用場景:事務管理、撤銷操作等。
- 優點:將操作與接收者解耦。
9.中介者模式
- 定義:用中介對象封裝對象間交互,減少耦合。
- 應用場景:聊天室、GUI組件交互等。
- 優點:避免對象間直接引用,降低復雜度。
10.解釋器模式
- 定義:定義語言的文法表示,并解釋執行。
- 應用場景:SQL解析、正則表達式等。
- 缺點:復雜語言解析效率低。
11.責任鏈模式
- 定義:將請求沿處理鏈傳遞,直到有對象處理它。
- 應用場景:Web請求處理、審批流程等。
- 優點:解耦請求發送者和接收者。
速記口訣
- 單抽工建原。
- 橋代理組裝適配器,享元回家裝飾外觀。
- 訪問者寫好策略備忘錄,觀察模板迭代的狀態,命令中介解釋責任鏈。