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