概述
首先說明一下,簡單工廠模式不屬于23種GOF設計模式之一。它也稱作靜态工廠方法模式,是工廠方法模式的特殊實作。這裡對簡單工廠模式進行介紹,是為本系列後面的工廠方法和抽象工廠模式做一個引子。
定義
“專門定義一個類來負責建立其他類的執行個體,被建立的執行個體常常具有共同的父類。”
實際上就是由一個工廠類,根據傳入的參數,動态的決定建立出哪一個産品類的執行個體。
結構圖
結構圖的講解在示例中再進行說明。
示例
進入代碼之前,咱們先将示例的情景說明一下:在項目開發中,我們有時會遇到需要繪制各種統計圖形的需求,如線形圖、餅狀圖等等。這裡,我們使用圖形工廠類來負責生成線形圖類、餅狀圖類的對象,結構圖如下所示:
從結構圖可以看出,線形圖類(LineChart)和餅狀圖類(PieChart)實作了圖形接口(IChart),并負責實作圖形接口中定義的方法drawing。在圖形工廠類(ChartFactory)中定義了一個getChart方法,該方法根據傳入的參數type,來決定具體建立出哪一種圖形類(PieChart或LineChart)的執行個體。代碼如下所示:
IChart.h:
1 @protocol IChart <NSObject>
2
3 - (void)drawing;
LineChart.m(部分代碼):
1 - (void)drawing
2
3 {
4
5 NSLog(@"LineChart drawing.");
6
7 }
PieChart.m(部分代碼):
1 - (void)drawing
2
3 {
4
5 NSLog(@"PieChart drawing.");
6
7 }
ChatFactory.m(部分代碼):
1 @implementation ChartFactory
2
3
4
5 - (id<IChart>)getChart:(NSString *)type
6
7 {
8
9 if ([type isEqualToString:@"line"])
10
11 {
12
13 return [[[LineChart alloc] init] autorelease];
14
15 }
16
17 else if([type isEqualToString:@"pie"])
18
19 {
20
21 return [[[PieChart alloc] init] autorelease];
22
23 }
24
25 else
26
27 {
28
29 return nil;
30
31 }
32
33 }
用戶端調用代碼:
1 ChartFactory *chartFactory = [[ChartFactory alloc] init];
2
3 // id<IChart> chart = [chartFactory getChart:@"line"];
4
5 id<IChart> chart = [chartFactory getChart:@"pie"];
6
7 [chart drawing];
8
9 [chartFactory release];
通過以上的結構圖和代碼可知,簡單工廠模式主要有三種角色,分别是工廠角色、抽象産品角色和具體産品角色。
- 工廠類角色:簡單工廠模式的核心,負責根據傳入的參數來執行個體化具體的産品執行個體。
- 抽象産品角色:通常是工廠産生具體類的父類(或者是具體類實作的接口)。
- 具體産品角色:簡單工廠模式所建立的任何對象都是這個角色的執行個體。
優缺點
從上面的介紹可以看出,簡單工廠模式的優點是用戶端可以直接消費産品,而不必關心具體産品的實作,消除了用戶端直接建立産品對象的責任,實作了對責任的分割。
缺點是工廠類集中了所有産品的建立邏輯,一旦不能正常工作,整個系統都會受到影響,而且當産品類别多結構複雜的時候,把所有建立工作放進一個工廠來,會使後期程式的擴充較為困難。
通過優缺點的分析,我們可以在如下場景下使用簡單工廠模式:
- 工廠類負責建立的對象比較少時;
- 用戶端隻知道傳入工廠類的參數,對于如何建立對象的邏輯不必關心時。
源碼下載下傳 傳回目錄
循自然之道,撫浮躁之心