在軟件工程領域,設計模式是解決常見設計問題的經典、可復用的方案。其中,創建型模式專注于對象的創建機制,而工廠模式家族(簡單工廠、工廠方法與抽象工廠)則是這一類別中的核心成員,它們致力于讓系統更加靈活、可擴展,并解耦對象的創建與使用。本文將深入探討這三種工廠模式的原理、區別與應用場景。
核心思想:簡單工廠模式,又稱靜態工廠方法模式,它提供一個專門的類(工廠類)來負責創建其他類的實例。客戶端無需關心對象的具體創建邏輯,只需向工廠傳遞一個參數(如類型標識),即可獲得所需的產品對象。
結構解析:
1. 抽象產品(Product):定義產品的公共接口。
2. 具體產品(ConcreteProduct):實現抽象產品接口的具體類。
3. 工廠(Factory):核心類,包含一個靜態的創建方法(如 createProduct(type)),根據傳入的參數判斷并實例化對應的具體產品。
優點:
- 職責分離:將對象的創建邏輯從業務代碼中剝離,客戶端代碼更簡潔。
- 初步解耦:客戶端僅依賴于抽象產品和工廠,不直接依賴具體產品。
缺點與局限:
- 違反開閉原則:當需要新增產品類型時,必須修改工廠類的創建方法(增加新的 if-else 或 switch-case 分支),這不利于擴展。
- 工廠類職責過重:隨著產品種類增多,工廠方法會變得龐大而復雜。
適用場景:產品類型相對固定,且創建邏輯不復雜,變化頻率較低的場景。
核心思想:工廠方法模式是對簡單工廠的進一步抽象和擴展。它定義一個用于創建對象的接口(工廠接口),但將具體創建何種對象的工作推遲到子類中去完成。這樣,核心工廠類(或接口)就不再負責所有產品的創建,而是成為一個抽象的“創建者”。
結構解析:
1. 抽象產品(Product):同上。
2. 具體產品(ConcreteProduct):同上。
3. 抽象工廠/創建者(Creator):聲明工廠方法(factoryMethod()),該方法返回一個抽象產品類型的對象。它可能還包含一些依賴于產品的核心業務邏輯。
4. 具體工廠/具體創建者(ConcreteCreator):實現或重寫父類的工廠方法,返回一個具體產品的實例。
優點:
- 完全符合開閉原則:要增加新的產品,只需新增對應的具體產品和具體工廠類,無需修改任何現有代碼(包括抽象工廠和客戶端的高層邏輯)。
- 更強的可擴展性:系統更容易加入新的產品族。
- 依賴倒置:高層模塊(客戶端)和低層模塊(具體產品)都依賴于抽象(產品接口和工廠接口)。
缺點:
- 類的數量增多:每增加一個產品,就需要增加一個對應的具體工廠類,增加了系統的復雜度。
適用場景:
- 當一個類無法預知它必須創建的對象的類時。
- 當一個類希望由其子類來指定它所創建的對象時。
- 需要將產品對象的創建過程與使用過程解耦,并希望系統具備良好的擴展性。
核心思想:抽象工廠模式提供了一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。它強調的是“產品族”的概念。一個產品族由位于不同產品等級結構(如不同平臺、不同風格)中的一組產品構成。
結構解析:
1. 抽象產品族(AbstractProductA, AbstractProductB...):定義一類產品的接口,如“按鈕”、“文本框”。
2. 具體產品族(ConcreteProductA1/B1, ConcreteProductA2/B2...):實現抽象產品接口,構成一個具體的產品家族,如“Windows風格按鈕”和“Windows風格文本框”構成Windows家族。
3. 抽象工廠(AbstractFactory):聲明一組創建抽象產品的方法,每個方法對應一個產品等級。
4. 具體工廠(ConcreteFactory):實現抽象工廠的接口,負責創建一個具體產品族的所有產品。
優點:
- 保證產品兼容性:確保客戶端始終只使用同一個產品族中的對象,例如不會混用Windows按鈕和Mac文本框。
- 切換產品族容易:只需更換具體工廠,整個產品族就隨之改變。
- 符合開閉原則(對產品族):增加一個新的產品族(如新增一個“Linux風格”家族)非常方便。
缺點:
- 違反開閉原則(對產品等級):難以支持新增產品種類。例如,如果要在現有工廠中增加一個新的產品類型“復選框”(CheckBox),就需要修改所有的抽象工廠和具體工廠接口,這非常麻煩。
- 系統復雜度最高:類的數量急劇增加。
適用場景:
- 系統需要獨立于其產品的創建、組合和表示方式。
- 系統需要配置多個產品族中的一個來使用。
- 需要強調一系列相關產品對象的設計以便進行聯合使用。
- 提供一個產品類庫,但只想暴露它們的接口而非實現。
| 特性 | 簡單工廠 | 工廠方法 | 抽象工廠 |
| :--- | :--- | :--- | :--- |
| 核心目的 | 提供一個統一的入口創建對象 | 將對象的創建延遲到子類 | 創建一系列相關或依賴的對象(產品族) |
| 靈活性 | 低(需修改工廠類) | 高(新增具體工廠) | 高(切換產品族) |
| 擴展方向 | 難以擴展新產品類型 | 易于擴展新產品類型 | 易于擴展新產品族,難擴展新產品種類 |
| 結構復雜度 | 簡單 | 中等 | 復雜 |
| 典型關系 | 一個工廠 → 多種產品 | 一個工廠(接口/類) → 一種產品 | 一個工廠(接口/類) → 一個產品族 |
演進關系:可以理解為從簡單到復雜、從具體到抽象的過程。
- 簡單工廠是集中化的對象創建器。
- 工廠方法通過引入多態性,解決了簡單工廠違反開閉原則的問題,將創建職責分散。
- 抽象工廠則在工廠方法的基礎上,將關注點從“單個產品對象”提升到了“整個產品家族”,用于創建更復雜的、相互關聯的對象集。
在實際開發中,應根據系統的復雜度、預期的變化維度(是增加新產品種類,還是增加新的產品系列)來選擇合適的工廠模式,切勿為了使用模式而過度設計。
如若轉載,請注明出處:http://www.zgg888.cn/product/53.html
更新時間:2026-01-06 17:31:06