什么是抽象工廠
????抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠妙同,其提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口射富,而不必指定其具體類或創(chuàng)建的細(xì)節(jié)粥帚。抽象工廠模式常與原型模式、單例模式和其它設(shè)計(jì)模式一起使用芒涡。
抽象工廠與工廠方法的區(qū)別
抽象工廠 | 工廠方法 |
---|---|
通過對象組合創(chuàng)建抽象產(chǎn)品 | 通過類繼承創(chuàng)建抽象產(chǎn)品 |
創(chuàng)建多系列產(chǎn)品 | 創(chuàng)建一種產(chǎn)品 |
必須修改父類的接口才能支持新的產(chǎn)品 | 子類化創(chuàng)建者并重載工廠方法以創(chuàng)建新產(chǎn)品 |
什么時候使用抽象工廠
????當(dāng)系統(tǒng)有多于一個的產(chǎn)品族卖漫,一個產(chǎn)品族里定義了多個產(chǎn)品,而系統(tǒng)只需要其中某一族的產(chǎn)品時赠群。
抽象工廠的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
????當(dāng)一個產(chǎn)品族中的多個對象被設(shè)計(jì)成一起工作時,它能保證客戶端始終只使用同一個產(chǎn)品族中的對象查描。
缺點(diǎn)
????產(chǎn)品族擴(kuò)展非常困難突委,要增加一個系列的某一產(chǎn)品冬三,既要在抽象的 Factory
里加代碼,又要在具體 Factory
的里面加代碼长豁。
抽象工廠的實(shí)現(xiàn)
主題切換
現(xiàn)在有 Dark 和 Light 兩套不同風(fēng)格的主題,涉及 View
匠襟、Button
和 ToolBar
钝侠,其類名為:
-
DarkView
酸舍、DarkButton
和DarkToolBar
-
LightView
、LightButton
和LightToolBar
-
定義
ThemeFactory
抽象類@interface ThemeFactory : NSObject + (ThemeFactory *) factoryWithMode:(NSString *)mode; - (UIView *) themeView; - (UIButton *) themeButton; - (UIToolbar *) themeToolbar; @end @implementation ThemeFactory + (ThemeFactory *) factoryWithMode:(NSString *)mode; { if([mode isEqualToSting:@"Dark"]){ return [DarkFactory new]; } return [LightFactory new]; } - (UIView *) themeView{ return nil; } - (UIButton *) themeButton{ return nil; } - (UIToolbar *) themeToolbar{ return nil; } @end
-
定義
DarkFactory
實(shí)體類@interface DarkFactory : ThemeFactory { } - (UIView*) themeView; - (UIButton*) themeButton; - (UIToolbar*) themeToolbar; @end @implementation DarkFactory - (UIView*) themeView { // returns a custom view for Dark return [[DarkView alloc] init]; } - (UIButton*) themeButton { // returns a custom main button for Dark return [[DarkButton alloc] init]; - (UIToolbar*) themeToolbar { // returns a custom toolbar for Dark return [[DarkToolbar alloc] init]; } @end
-
定義
LightFactory
實(shí)體類@interface LightFactory : ThemeFactory { } - (UIView*) themeView; - (UIButton*) themeButton; - (UIToolbar*) themeToolbar; @end @implementation LightFactory - (UIView*) themeView { // returns a custom view for Light return [[LightView alloc] init]; } - (UIButton*) themeButton { // returns a custom main button for Light return [[LightButton alloc] init]; - (UIToolbar*) themeToolbar { // returns a custom toolbar for Light return [[LightToolbar alloc] init]; } @end
-
獲取對應(yīng)主題
ThemeFactory * factory = [ThemeFactory factoryWithMode:@"Dark"]; //... UIView * view = [factory themeView]; //... put the view on a proper location in view //... UIButton * button = [factory themeButton]; //... put the button on a proper location in view //... UIToolbar * toolbar = [factory themeToolbar];
Foundation 中的類簇
????類簇是 Foundation 框架廣泛使用的一種設(shè)計(jì)模式啃勉。類簇將許多私有的具體子類組合在一個公共抽象超類之下。以這種方式對類進(jìn)行分組簡化了面向?qū)ο罂蚣艿墓_可見架構(gòu)淮阐,而不會降低其功能豐富性。
????為了說明類簇架構(gòu)及其好處泣特,請考慮構(gòu)建類層次結(jié)構(gòu)的問題浩姥,該層次結(jié)構(gòu)定義對象以存儲不同類型的數(shù)字(char
状您、int
、float
膏孟、double
)眯分。因?yàn)椴煌愋偷臄?shù)量具有許多共同特征(例如柒桑,它們可以從一種類型轉(zhuǎn)換為另一種類型,并且可以表示為字符串)魁淳,所以它們可以由單個類表示飘诗。但是,它們的存儲要求不同疚察,因此用同一個類來表示它們是低效的蒸走。
????NSNumber
有很多 numberWith*
方法貌嫡,它們都是類方法,根據(jù)傳入?yún)?shù)生成各種 NSNumber
的實(shí)例岛抄。如何創(chuàng)建 NSNumber
的具體子類型的實(shí)例都是由 NSNumber
的類方法負(fù)責(zé)别惦,由于其是在類級別提供了方法以達(dá)到類似的效果夫椭,也成為類工廠方法。
????類簇基于抽象工廠設(shè)計(jì)模式蹭秋,比如 NSNumber
本身是一個高度抽象的工廠扰付,而 NSCFBoolean
和 NSCFNumber
是具體工廠子類仁讨。子類是具體工廠,因?yàn)樗鼈冎剌d了 NSNumber
中聲明的抽象工廠方法以生產(chǎn)產(chǎn)品洞豁。
總結(jié)
????抽象工廠模式可以涉及許多類型的對象創(chuàng)建盐固,提供其抽象而不暴露創(chuàng)建過程中任何不必要的細(xì)節(jié)或所創(chuàng)建對象的確切類型丈挟。在抽象工廠模式中增加新的系列,直接擴(kuò)展一個工廠子類及對應(yīng)的抽象子類曙咽,對整個模式框架不會帶來其他影響蛔趴。如果增加一個新的類型桐绒,創(chuàng)建新的類型對應(yīng)的類之拨,并對整個抽象工廠類及其子類進(jìn)行方法擴(kuò)展茉继。