在Java軟件開發中,創建對象是一個頻繁且關鍵的環節。工廠模式作為一種經典的創建型設計模式,旨在提供一種創建對象的最佳方式,將對象的實例化過程與使用過程分離,從而提升代碼的靈活性、可維護性和可擴展性。本文將通過圖文結合的方式,深入剖析工廠模式的三種核心形式:簡單工廠模式、工廠方法模式和抽象工廠模式,并探討其設計與實現。
核心思想:簡單工廠模式,又稱靜態工廠方法模式,它定義一個工廠類,根據傳入的參數,動態決定創建哪一種產品類的實例。
圖文設計:
┌─────────────┐
│ Client │
└──────┬──────┘
│ 請求產品
┌──────▼──────┐
│ SimpleFactory │
│ +createProduct│?──┐
└──────┬──────┘ │
│ 根據參數創建 │ 產品類型參數
┌──────▼──────┐ │
┌───┤ Product │ │
│ │ +use() │ │
│ └─────────────┘ │
│ ┌─────────────┐ │
└──?│ ProductA │ │
│ +use() │ │
└─────────────┘ │
┌─────────────┐ │
│ ProductB │────┘
│ +use() │
└─────────────┘
角色分析:
- 工廠角色(SimpleFactory):負責實現創建所有實例的內部邏輯,提供一個靜態方法供客戶端調用。
- 抽象產品角色(Product):定義產品的公共接口。
- 具體產品角色(ProductA/B):實現抽象產品接口的具體類。
優點:客戶端無需知道具體產品類名,只需知道參數,實現了責任分離。
缺點:工廠類職責過重,新增產品需要修改工廠類邏輯,違反開閉原則。
核心思想:定義一個用于創建對象的接口,但讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
圖文設計:
┌─────────────┐ ┌─────────────┐
│ Client ├───────?│ Factory │
└─────────────┘ │+createProduct│
└──────┬──────┘
│
┌──────────────┴──────────────┐
│ │
┌──────▼──────┐ ┌──────▼──────┐
│FactoryA │ │FactoryB │
│+createProduct│ │+createProduct│
└──────┬──────┘ └──────┬──────┘
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ ProductA │ │ ProductB │
│ +use() │ │ +use() │
└─────────────┘ └─────────────┘
角色分析:
- 抽象工廠(Factory):聲明工廠方法,返回一個產品類型對象。
- 具體工廠(FactoryA/B):實現工廠方法,返回具體產品實例。
- 抽象產品(Product):定義產品接口。
- 具體產品(ProductA/B):實現產品接口。
優點:完全符合開閉原則,新增產品只需新增對應工廠類,無需修改已有代碼。
缺點:每增加一個產品,就需要增加一個具體工廠類,導致類數量增多,系統復雜度增加。
核心思想:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。它強調的是“產品族”的概念。
圖文設計:
┌─────────────┐
│ Client │
└──────┬──────┘
│ 使用工廠創建產品族
┌──────▼──────┐
│AbstractFactory│
│+createProductA│
│+createProductB│
└──────┬──────┘
│
┌──────────┴──────────┐
│ │
┌───▼──────┐ ┌──────▼────┐
│Factory1 │ │Factory2 │
│+createA()│ │+createA() │
│+createB()│ │+createB() │
└───┬──────┘ └──────┬────┘
│ │
│ ┌──────────┐ │ ┌──────────┐
└──?│ProductA1 │ └──?│ProductA2 │
└──────────┘ └──────────┘
│ ┌──────────┐ │ ┌──────────┐
└──?│ProductB1 │ └──?│ProductB2 │
└──────────┘ └──────────┘
角色分析:
- 抽象工廠(AbstractFactory):聲明一組創建一族產品的方法。
- 具體工廠(Factory1/2):實現抽象工廠的方法,生成一族具體產品。
- 抽象產品(ProductA/B):為每種產品聲明接口。
- 具體產品(ProductA1/B1, A2/B2):定義具體工廠生產的特定產品。
應用場景:例如,一個GUI庫需要為不同操作系統(如Windows, Mac)提供一套風格一致的按鈕(Button)、文本框(Text)等控件。抽象工廠能確保同一工廠生產的產品(如WindowsButton和WindowsText)是兼容的。
優點:保證了客戶端始終只使用同一個產品族中的對象,方便切換整個產品族。
缺點:產品族擴展困難(例如新增一個產品類型C,需要修改所有工廠接口和類),且系統結構復雜。
| 模式 | 核心目標 | 復雜度 | 符合開閉原則 | 適用場景 |
| :--- | :--- | :--- | :--- | :--- |
| 簡單工廠 | 將對象創建邏輯集中管理 | 低 | 工廠類不符合 | 產品類型較少,且不頻繁變化 |
| 工廠方法 | 將具體產品的創建延遲到子類 | 中 | 完全符合 | 不關心具體產品類,但關心產品系列如何被創建 |
| 抽象工廠 | 創建相關或依賴的產品族 | 高 | 產品族符合,產品等級不符合 | 需要創建一系列相關的產品對象 |
設計制作建議:
1. 從簡單開始:如果系統簡單,產品類型固定,優先考慮簡單工廠。
2. 擁抱擴展:當預計未來產品類型會頻繁增加時,應采用工廠方法模式。
3. 關注整體:當需要確保一系列相關產品一起工作時,抽象工廠是首選。
4. 圖文輔助:在設計時,繪制上述UML類圖或示意圖,能清晰展示角色關系和創建流程,是溝通和理解的強大工具。
通過合理運用這三種工廠模式,開發者可以構建出松耦合、高內聚且易于維護的Java應用程序架構。
如若轉載,請注明出處:http://m.pottv.cn/product/58.html
更新時間:2026-01-27 15:25:48