0、序
- 在上一篇文章《工廠方法模式》中,我們定義了奧迪工廠
AudiFactory生產(chǎn)出來的就是奧迪汽車和 奔馳工廠BenzFactory生產(chǎn)出來的就是奔馳汽車,但是隨著其發(fā)展,奧迪工廠不僅僅生產(chǎn)一種車了,而是生產(chǎn)種種系列車型,比如有SUV系列產(chǎn)品與MPV系列產(chǎn)品,那么此時我們的AudiFactory就不能滿足需求了,那么該怎么辦呢? -
抽象工廠模式正好能解決上面的問題,讓我們一起來看看抽象工廠。 - 在之前我們先記住上面的一個詞
系列產(chǎn)品;
1、抽象工廠模式簡述
- 對一組具有
相同主題的工廠進(jìn)行封裝以上面的汽車為例,在抽象工廠模式中,會有SUV工廠和MPV工廠,還有一個大的抽象工廠,里面涵蓋了SUV工廠和MPV工廠所有能做的事情。
上面所說的SUV工廠、MPV工廠其實都是可以生產(chǎn)一系列產(chǎn)品的(SUV汽車或者M(jìn)PV汽車),也就是
產(chǎn)品族的概念。而在工廠方法模式中,其工廠生產(chǎn)出來的產(chǎn)品是屬于同一個產(chǎn)品等級(比如:不同廠商生產(chǎn)的汽車-奧迪汽車和奔馳汽車)。- 相圖
2、抽象工廠模式角色劃分
-
抽象工廠
- 抽象類,內(nèi)部提供了所有工廠的接口
-
具體工廠
- 具體工廠:可生產(chǎn)所有的系列產(chǎn)品(
產(chǎn)品族);
- 具體工廠:可生產(chǎn)所有的系列產(chǎn)品(
-
產(chǎn)品系列A
- 抽象產(chǎn)品A:內(nèi)部提供了A系列產(chǎn)品的共有功能;
- 具體產(chǎn)品A:A系列具體的單個產(chǎn)品;
-
注:當(dāng)然,還有A系列的其他的產(chǎn)品,它們屬于同一個
產(chǎn)品等級;
-
產(chǎn)品系列B
- 抽象產(chǎn)品B:內(nèi)部提供了B系列產(chǎn)品的共有功能;
- 具體產(chǎn)品B:B系列具體的單個產(chǎn)品;
-
注:當(dāng)然,還有B系列的其他的產(chǎn)品,它們屬于同一個
產(chǎn)品等級;
3、抽象工廠模式UML類圖
- 抽象工廠模式
4、抽象工廠模式示意代碼
-
抽象工廠:
YCarAbsFactory- 內(nèi)部提供了所有工廠的接口
@protocol YCarAbsFactory <NSObject> + (id<YSuvCar>)creatSuvCar; // 創(chuàng)建SUV系列的車 + (id<YMpvCar>)creatMpvCar; // 創(chuàng)建MPV系列的車 @end -
具體工廠
- 具體工廠1:
YAudiCarFactory:可生產(chǎn)所有的系列產(chǎn)品(產(chǎn)品族);
@implementation YAudiCarFactory + (id<YSuvCar>)creatSuvCar { return [[YAudiSuvCar alloc] init]; // 創(chuàng)建具體的奧迪SUV } + (id<YMpvCar>)creatMpvCar { return [[YAudiMpvCar alloc] init]; // 創(chuàng)建具體的奧迪MPV } @end- 具體工廠2:
YBenzCarFactory:可生產(chǎn)所有的系列產(chǎn)品(產(chǎn)品族);
@implementation YBenzCarFactory + (id<YSuvCar>)creatSuvCar { return [[YBenzSuvCar alloc] init]; // 創(chuàng)建具體的奔馳SUV } + (id<YMpvCar>)creatMpvCar { return [[YBenzMpvCar alloc] init]; // 創(chuàng)建具體的奔馳MPV } @end- 補(bǔ)充:可能還會有一個具體工廠3,比如:寶馬工廠,寶馬工廠同樣能生產(chǎn)SUV的車和MPV的車,并且根據(jù)需要在內(nèi)部實現(xiàn)創(chuàng)建具體的產(chǎn)品邏輯;
- 具體工廠1:
-
產(chǎn)品系列A
- 抽象產(chǎn)品:
YSuvCar:內(nèi)部提供了A系列產(chǎn)品的共有功能;
@protocol YSuvCar <NSObject> - (void)suvRun; @end- 具體產(chǎn)品a1:
YAudiSuvCar
@implementation YAudiSuvCar - (void)suvRun { NSLog(@"奧迪SUV跑起來了"); } @end- 具體產(chǎn)品a2:
YBenzSuvCar
@implementation YBenzSuvCar - (void)suvRun { NSLog(@"奔馳SUV跑起來了"); } @end-
注:上面的a1、a2屬于同一個
產(chǎn)品族(SUV車系)的不同產(chǎn)品等級(奧迪、奔馳);
- 抽象產(chǎn)品:
-
產(chǎn)品系列B
- 抽象產(chǎn)品B:
YMpvCar:內(nèi)部提供了B系列產(chǎn)品的共有功能;
@protocol YMpvCar <NSObject> - (void)mpvRun; @end- 具體產(chǎn)品b1:
YAudiMpvCar
@implementation YAudiMpvCar - (void)mpvRun { NSLog(@"奧迪MPV跑起來了"); } @end- 具體產(chǎn)品b2:
YBenzMpvCar
@implementation YBenzMpvCar - (void)mpvRun { NSLog(@"奔馳MPV跑起來了"); } @end-
注:上面的b1、b2屬于同一個
產(chǎn)品族(MPV車系)的不同產(chǎn)品等級(奧迪、奔馳);
- 抽象產(chǎn)品B:
-
Client使用
// 奧迪SUV id<YSuvCar> audiSuv = [YAudiCarFactory creatSuvCar]; [audiSuv suvRun]; // 奧迪MPV id<YMpvCar> audiMpv = [YAudiCarFactory creatMpvCar]; [audiMpv mpvRun]; // 奔馳SUV id<YSuvCar> benzSuv = [YBenzCarFactory creatSuvCar]; [benzSuv suvRun]; // 奔馳MPV id<YMpvCar> benzMpv = [YBenzCarFactory creatMpvCar]; [benzMpv mpvRun]; // 運(yùn)行結(jié)果: 奧迪SUV跑起來了 奧迪MPV跑起來了 奔馳SUV跑起來了 奔馳MPV跑起來了
5、抽象工廠模式與工廠方法模式對比
| 工廠方法模式 | 抽象工廠模式 |
|---|---|
| 工廠類一般只有一個方法,創(chuàng)建一種產(chǎn)品 | 工廠類有多個方法,創(chuàng)建多系列產(chǎn)品 |
| 只涉及產(chǎn)品等級 | 涉及產(chǎn)品等級與產(chǎn)品族 |
| 增加子類即可添加新產(chǎn)品 | 必須修改父類接口才能添加新產(chǎn)品 |

