IOS設計模式淺析之簡單工廠模式(SimpleFactory)


概述

  首先說明一下,簡單工廠模式不屬於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];

  通過以上的結構圖和代碼可知,簡單工廠模式主要有三種角色,分別是工廠角色、抽象產品角色和具體產品角色。

  1. 工廠類角色:簡單工廠模式的核心,負責根據傳入的參數來實例化具體的產品實例。
  2. 抽象產品角色:通常是工廠產生具體類的父類(或者是具體類實現的接口)。
  3. 具體產品角色:簡單工廠模式所創建的任何對象都是這個角色的實例。

優缺點                        

  從上面的介紹可以看出,簡單工廠模式的優點是客戶端可以直接消費產品,而不必關心具體產品的實現,消除了客戶端直接創建產品對象的責任,實現了對責任的分割。

  缺點是工廠類集中了所有產品的創建邏輯,一旦不能正常工作,整個系統都會受到影響,而且當產品類別多結構復雜的時候,把所有創建工作放進一個工廠來,會使后期程序的擴展較為困難。

  通過優缺點的分析,我們可以在如下場景下使用簡單工廠模式:

  1. 工廠類負責創建的對象比較少時;
  2. 客戶端只知道傳入工廠類的參數,對於如何創建對象的邏輯不必關心時。

  源碼下載   返回目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM