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