以下是軟件設計中常見的 **23種經典設計模式**(基于《設計模式:可復用面向對象軟件的基礎》GoF 的經典分類),并結合 **Python 語言特性**的簡要說明和典型應用場景。我將它們分為 **創建型、結構型、行為型** 三大類,供你系統學習:
---
### **一、創建型模式 (Creational Patterns)**
關注對象的創建機制,提高代碼靈活性和可復用性。
1. **單例模式 (Singleton)** ?
? ?- **目的**: 確保一個類只有一個實例,并提供全局訪問點。 ?
? ?- **Python 應用**: 模塊天然單例、元類控制實例化、`__new__` 方法重寫。 ?
? ?- **場景**: 配置管理、數據庫連接池。
2. **工廠方法模式 (Factory Method)** ?
? ?- **目的**: 定義一個創建對象的接口,由子類決定實例化哪個類。 ?
? ?- **Python 應用**: 類方法作為工廠函數,返回不同子類對象。 ?
? ?- **場景**: 動態創建不同數據格式的解析器。
3. **抽象工廠模式 (Abstract Factory)** ?
? ?- **目的**: 創建一系列相關或依賴對象的家族,而無需指定具體類。 ?
? ?- **Python 應用**: 通過工廠類組合多個工廠方法。 ?
? ?- **場景**: GUI 庫跨平臺組件(按鈕、文本框)。
4. **建造者模式 (Builder)** ?
? ?- **目的**: 將復雜對象的構建與其表示分離,分步驟構造對象。 ?
? ?- **Python 應用**: 鏈式調用配置對象屬性。 ?
? ?- **場景**: 構造復雜查詢語句、HTTP 請求生成。
5. **原型模式 (Prototype)** ?
? ?- **目的**: 通過復制現有對象來創建新對象,避免重復初始化。 ?
? ?- **Python 應用**: `copy` 模塊(`deepcopy` 實現深拷貝)。 ?
? ?- **場景**: 游戲中的敵人克隆、配置模板復制。
---
### **二、結構型模式 (Structural Patterns)**
處理類或對象的組合,形成更大的結構。
6. **適配器模式 (Adapter)** ?
? ?- **目的**: 將不兼容接口轉換為客戶端期望的接口。 ?
? ?- **Python 應用**: 類適配器(多繼承)、對象適配器(組合)。 ?
? ?- **場景**: 集成第三方庫的舊接口。
7. **橋接模式 (Bridge)** ?
? ?- **目的**: 將抽象部分與其實現部分分離,使二者獨立變化。 ?
? ?- **Python 應用**: 抽象類與實現類解耦。 ?
? ?- **場景**: 不同圖形渲染引擎的切換。
8. **組合模式 (Composite)** ?
? ?- **目的**: 以樹形結構組合對象,統一處理單個對象和組合對象。 ?
? ?- **Python 應用**: 遞歸處理文件系統目錄結構。 ?
? ?- **場景**: 菜單嵌套子菜單、UI 組件樹。
9. **裝飾器模式 (Decorator)** ?
? ?- **目的**: 動態地為對象添加額外職責,比繼承更靈活。 ?
? ?- **Python 應用**: `@decorator` 語法糖,函數包裝器。 ?
? ?- **場景**: 日志記錄、權限校驗、緩存增強。
10. **外觀模式 (Facade)** ?
? ? - **目的**: 提供統一的接口簡化子系統復雜性。 ?
? ? - **Python 應用**: 封裝底層模塊調用流程。 ?
? ? - **場景**: API 網關、數據庫遷移工具。
11. **享元模式 (Flyweight)** ?
? ? - **目的**: 共享大量細粒度對象,減少內存消耗。 ?
? ? - **Python 應用**: 緩存常用對象(如字符、圖標)。 ?
? ? - **場景**: 文本編輯器中的字符渲染、游戲中的粒子系統。
12. **代理模式 (Proxy)** ?
? ? - **目的**: 為其他對象提供代理以控制對其訪問。 ?
? ? - **Python 應用**: 延遲加載(Lazy Loading)、權限控制。 ?
? ? - **場景**: 圖片懶加載、ORM 中的延遲查詢。
---
### **三、行為型模式 (Behavioral Patterns)**
關注對象間的通信和職責分配。
13. **責任鏈模式 (Chain of Responsibility)** ?
? ? - **目的**: 將請求的發送者和接收者解耦,使多個對象都有機會處理請求。 ?
? ? - **Python 應用**: 鏈表式處理器傳遞請求。 ?
? ? - **場景**: HTTP 中間件、異常處理鏈。
14. **命令模式 (Command)** ?
? ? - **目的**: 將請求封裝為對象,支持請求的排隊、日志、撤銷。 ?
? ? - **Python 應用**: 封裝函數為可調用對象。 ?
? ? - **場景**: 任務隊列、GUI 按鈕操作。
15. **解釋器模式 (Interpreter)** ?
? ? - **目的**: 定義語言的語法,并解釋執行語句。 ?
? ? - **Python 應用**: 實現 DSL(領域特定語言)。 ?
? ? - **場景**: 正則表達式引擎、SQL 解析。
16. **迭代器模式 (Iterator)** ?
? ? - **目的**: 提供一種方法順序訪問聚合對象的元素,而無需暴露內部結構。 ?
? ? - **Python 應用**: `__iter__` 和 `__next__` 方法實現迭代協議。 ?
? ? - **場景**: 遍歷自定義集合、分頁查詢。
17. **中介者模式 (Mediator)** ?
? ? - **目的**: 定義一個中介對象封裝對象間的交互,降低耦合度。 ?
? ? - **Python 應用**: 聊天室協調多個用戶通信。 ?
? ? - **場景**: 事件總線、UI 組件通信。
18. **備忘錄模式 (Memento)** ?
? ? - **目的**: 在不破壞封裝的前提下,捕獲并保存對象狀態以便恢復。 ?
? ? - **Python 應用**: 序列化對象狀態(`pickle`)。 ?
? ? - **場景**: 撤銷操作、游戲存檔。
19. **觀察者模式 (Observer)** ?
? ? - **目的**: 定義對象間的一對多依賴關系,當對象狀態變化時自動通知依賴項。 ?
? ? - **Python 應用**: Django Signals、事件監聽。 ?
? ? - **場景**: 實時數據監控、發布訂閱系統。
20. **狀態模式 (State)** ?
? ? - **目的**: 允許對象在其內部狀態改變時改變行為。 ?
? ? - **Python 應用**: 狀態機實現,上下文類委托狀態對象。 ?
? ? - **場景**: 訂單狀態流轉、游戲角色行為切換。
21. **策略模式 (Strategy)** ?
? ? - **目的**: 定義一系列算法,封裝每個算法并使它們可互換。 ?
? ? - **Python 應用**: 函數作為一等公民傳遞策略。 ?
? ? - **場景**: 排序算法選擇、支付方式切換。
22. **模板方法模式 (Template Method)** ?
? ? - **目的**: 定義算法的骨架,將某些步驟延遲到子類實現。 ?
? ? - **Python 應用**: 抽象基類(`abc` 模塊)定義模板方法。 ?
? ? - **場景**: 數據處理的標準化流程(如 ETL)。
23. **訪問者模式 (Visitor)** ?
? ? - **目的**: 在不修改類的前提下為類添加新操作。 ?
? ? - **Python 應用**: 雙重分派(`@singledispatch`)。 ?
? ? - **場景**: 語法樹分析、報表生成。
---
### **其他常用模式 (補充)**
- **依賴注入 (Dependency Injection)**: 通過外部傳遞依賴對象(如 Flask 的上下文管理)。
- **對象池模式 (Object Pool)**: 復用昂貴資源(如數據庫連接池)。
- **規格模式 (Specification)**: 組合業務規則(如查詢過濾器)。
---
### **學習建議**
1. **按分類循序漸進**:先掌握創建型,再結構型,最后行為型。
2. **結合 Python 特性**:理解 Python 的動態性和簡潔語法如何簡化模式實現。
3. **實踐項目驅動**:嘗試在框架(如 Django、Flask)或開源代碼中尋找模式應用。
4. **對比模式差異**:例如區分「策略模式」與「狀態模式」、「代理模式」與「裝飾器模式」。
如果需要更詳細的某個模式的代碼示例或深入解析,請告訴我,我可以為你展開說明!