概述
首先說明一下,簡單工廠模式不屬于23種GOF設計模式之一教翩。它也稱作靜態(tài)工廠方法模式杆勇,是工廠方法模式的特殊實現(xiàn)。這里對簡單工廠模式進行介紹饱亿,是為本系列后面的工廠方法和抽象工廠模式做一個引子蚜退。
定義:
“專門定義一個類來負責創(chuàng)建其他類的實例闰靴,被創(chuàng)建的實例常常具有共同的父類∽曜ⅲ”
實際上就是由一個工廠類蚂且,根據(jù)傳入的參數(shù)幅恋,動態(tài)的決定創(chuàng)建出哪一個產(chǎn)品類的實例。
結(jié)構圖
進入代碼之前,咱們先將示例的情景說明一下:在項目開發(fā)中窒舟,我們有時會遇到需要繪制各種統(tǒng)計圖形的需求惠豺,如線形圖洁墙、餅狀圖等等戒财。這里饮寞,我們使用圖形工廠類來負責生成線形圖類幽崩、餅狀圖類的對象慌申,結(jié)構圖如下所示:
從結(jié)構圖可以看出蹄溉,線形圖類(LineChart)和餅狀圖類(PieChart)實現(xiàn)了圖形接口(IChart)柒爵,并負責實現(xiàn)圖形接口中定義的方法drawing棉胀。在圖形工廠類(ChartFactory)中定義了一個getChart方法,該方法根據(jù)傳入的參數(shù)type畸写,來決定具體創(chuàng)建出哪一種圖形類(PieChart或LineChart)的實例枯芬。代碼如下所示:
IChart.h:
@protocol IChart <NSObject>
代理方法
- (void)drawing;
LineChart.m(部分代碼):
- (void)drawing
{
NSLog(@"LineChart drawing.");
}
PieChart.m(部分代碼):
- (void)drawing
{
NSLog(@"PieChart drawing.");
}
ChatFactory.h(部分代碼):
typedef enum :NSUInteger{
LineChartType,
PieChartType,
}ChartType;
@interface ChartFactory : NSObject
- (id<IChart>)getChart:(ChartType )type
@end
ChatFactory.m(部分代碼):
@implementation ChartFactory
- (id<IChart>)getChart:(ChartType *)type
{
if (type == LineChartType )
{
return [[LineChart alloc] init];
}
else if(type == PieChartType )
{
return [[PieChart alloc] init];
}
else
{
return nil;
}
}
客戶端調(diào)用代碼:
ChartFactory *chartFactory = [[ChartFactory alloc] init];
// id<IChart> chart = [chartFactory getChart: LineChartType];
id<IChart> chart = [chartFactory getChart: PieChartType];
[chart drawing];
總結(jié):
通過以上的結(jié)構圖和代碼可知,簡單工廠模式主要有三種角色淫痰,分別是工廠角色待错、抽象產(chǎn)品角色和具體產(chǎn)品角色烈评。
工廠類角色:簡單工廠模式的核心讲冠,負責根據(jù)傳入的參數(shù)來實例化具體的產(chǎn)品實例竿开。
抽象產(chǎn)品角色:通常是工廠產(chǎn)生具體類的父類(或者是具體類實現(xiàn)的接口)否彩。
具體產(chǎn)品角色:簡單工廠模式所創(chuàng)建的任何對象都是這個角色的實例胳搞。
優(yōu)缺點
從上面的介紹可以看出肌毅,簡單工廠模式的優(yōu)點是客戶端可以直接消費產(chǎn)品悬而,而不必關心具體產(chǎn)品的實現(xiàn)笨奠,消除了客戶端直接創(chuàng)建產(chǎn)品對象的責任般婆,實現(xiàn)了對責任的分割蔚袍。
缺點是工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯啤咽,一旦不能正常工作宇整,整個系統(tǒng)都會受到影響鳞青,而且當產(chǎn)品類別多結(jié)構復雜的時候臂拓,把所有創(chuàng)建工作放進一個工廠來埃儿,會使后期程序的擴展較為困難童番。
通過優(yōu)缺點的分析剃斧,我們可以在如下場景下使用簡單工廠模式:
工廠類負責創(chuàng)建的對象比較少時臂容;
客戶端只知道傳入工廠類的參數(shù)根蟹,對于如何創(chuàng)建對象的邏輯不必關心時球散。
附上本人的github鏈接