一铭腕、概念
1较解、簡(jiǎn)單工廠模式定義
? 簡(jiǎn)單工廠模式(Simple Factory Pattern):定義一個(gè)工廠類刊愚,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例吃粒,被創(chuàng)建的實(shí)例通常都具有共同的父類崇猫。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)(static)方法奄喂,因此簡(jiǎn)單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式改橘,它屬于類創(chuàng)建型模式榕堰。
? 簡(jiǎn)單工廠模式并不屬于GoF 23個(gè)經(jīng)典設(shè)計(jì)模式叠纹,但通常將它作為學(xué)習(xí)其他工廠模式的基礎(chǔ)季研。
2、簡(jiǎn)單工廠模式包含的角色
1)Factory(工廠角色):工廠角色即工廠類誉察,它是簡(jiǎn)單工廠模式的核心与涡,負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有產(chǎn)品實(shí)例的內(nèi)部邏輯;工廠類可以被外界直接調(diào)用持偏,創(chuàng)建所需的產(chǎn)品對(duì)象驼卖;在工廠類中提供了靜態(tài)的工廠方法factoryMethod(),它的返回類型為抽象產(chǎn)品類型Product鸿秆。
2)Product(抽象產(chǎn)品角色):它是工廠類所創(chuàng)建的所有對(duì)象的父類酌畜,封裝了各種產(chǎn)品對(duì)象的公有方法,它的引入將提高系統(tǒng)的靈活性卿叽,使得在工廠類中只需定義一個(gè)通用的工廠方法桥胞,因?yàn)樗袆?chuàng)建的具體產(chǎn)品對(duì)象都是其子類對(duì)象。
3)ConcreteProduct(具體產(chǎn)品角色):它是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)考婴,所有被創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例贩虾。每一個(gè)具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色,需要實(shí)現(xiàn)在抽象產(chǎn)品中聲明的抽象方法沥阱。
? 簡(jiǎn)單工廠模式的要點(diǎn):當(dāng)你需要什么缎罢,只需要傳入一個(gè)正確的參數(shù),就可以獲取你所需要的對(duì)象,而無(wú)須知道其創(chuàng)建細(xì)節(jié)策精。
3舰始、結(jié)構(gòu)圖
二、示例
? 本Demo以工廠生產(chǎn)空調(diào)和電視為例:
1)先創(chuàng)建Appliance電器類蛮寂,有個(gè)work()方法蔽午,表示抽象產(chǎn)品角色;
2)然后創(chuàng)建AirConditioning和Television類酬蹋,都繼承自Appliance類及老,并實(shí)現(xiàn)父類的方法,表示具體產(chǎn)品角色范抓;
3)最后創(chuàng)建Factory類骄恶,有一個(gè)factoryWithString()方法,表示工廠類匕垫。
具體代碼如下:
Appliance類:
// 定義兩個(gè)常量
#define kAirConditioning @"AirConditioning"
#define kTelevision @"Television"
// 電器類:抽象產(chǎn)品類
@interface Appliance : NSObject
// OC沒(méi)有abstract方法僧鲁,可以定義一個(gè)協(xié)議表示接口,實(shí)現(xiàn)抽象方法的效果
- (void)work; //抽象方法
@end
@implementation Appliance
- (void)work {}
@end
AirConditioning和Television類:
// AirConditioning 空調(diào):具體產(chǎn)品類
@interface AirConditioning : Appliance
@end
@implementation AirConditioning
- (void)work {
NSLog(@"夏天開(kāi)空調(diào)好涼快呀");
}
@end
// Television 電視:具體產(chǎn)品類
@interface Television : Appliance
@end
@implementation Television
- (void)work {
NSLog(@"龍珠電視超級(jí)好看");
}
@end
Factory類:
// 工廠類
@interface Factory : NSObject
+ (Appliance *)factoryWithString:(NSString *)string; //工廠方法
@end
@implementation Factory
+ (Appliance *)factoryWithString:(NSString *)string {
Appliance *appliance = nil;
if ([string isEqualToString:kAirConditioning]) {
appliance = [AirConditioning new];
} else if ([string isEqualToString:kTelevision]) {
appliance = [Television new];
}
return appliance;
}
@end
運(yùn)行代碼:
- (void)viewDidLoad {
[super viewDidLoad];
Appliance *airConditioning = [Factory factoryWithString:kAirConditioning];
[airConditioning work];
Appliance *tv = [Factory factoryWithString:kTelevision];
[tv work];
}
打印結(jié)果:
夏天開(kāi)空調(diào)好涼快呀
龍珠電視超級(jí)好看
三象泵、總結(jié)
? 簡(jiǎn)單工廠模式的簡(jiǎn)化:有時(shí)候寞秃,為了簡(jiǎn)化簡(jiǎn)單工廠模式,我們可以將抽象產(chǎn)品類和工廠類合并偶惠,將靜態(tài)工廠方法移至抽象產(chǎn)品類中春寿。比如在Appliance類中添加一個(gè)方法:
@interface Appliance : NSObject
- (void)work; //抽象方法
+ (Appliance *)applianceWithString:(NSString *)string; //創(chuàng)建方法,邏輯和Factory一致
@end
? 簡(jiǎn)單工廠模式提供了專門的工廠類用于創(chuàng)建對(duì)象忽孽,將對(duì)象的創(chuàng)建和對(duì)象的使用分離開(kāi)绑改,它作為一種最簡(jiǎn)單的工廠模式在軟件開(kāi)發(fā)中得到了較為廣泛的應(yīng)用。
1兄一、優(yōu)點(diǎn)
1厘线、工廠類包含必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例出革,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的職責(zé)造壮,而僅僅“消費(fèi)”產(chǎn)品,簡(jiǎn)單工廠模式實(shí)現(xiàn)了對(duì)象創(chuàng)建和使用的分離骂束。
2费薄、客戶端無(wú)須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可栖雾,對(duì)于一些復(fù)雜的類名楞抡,通過(guò)簡(jiǎn)單工廠模式可以在一定程度減少使用者的記憶量。
3析藕、通過(guò)引入配置文件召廷,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性。
2竞慢、缺點(diǎn)
1先紫、由于工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯,職責(zé)過(guò)重筹煮,一旦不能正常工作遮精,整個(gè)系統(tǒng)都要受到影響。
2败潦、系統(tǒng)擴(kuò)展困難本冲,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí)劫扒,有可能造成工廠邏輯過(guò)于復(fù)雜檬洞,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
3沟饥、簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法添怔,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)。
3贤旷、適用場(chǎng)景
1广料、工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少,由于創(chuàng)建的對(duì)象較少幼驶,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過(guò)復(fù)雜性昭。
2、客戶端只知道傳入工廠類的參數(shù)县遣,對(duì)于如何創(chuàng)建對(duì)象并不關(guān)心。
Demo地址:iOS-Design-Patterns