抽象工廠模式

Objective-C編程之道 iOS設(shè)計(jì)模式解析
iOS設(shè)計(jì)模式解析-工廠模式
iOS設(shè)計(jì)模式解析-抽象工廠模式
iOS設(shè)計(jì)模式解析-外觀模式
iOS設(shè)計(jì)模式解析-中介者模式
iOS設(shè)計(jì)模式解析-觀察者模式
iOS設(shè)計(jì)模式解析-裝飾模式
iOS設(shè)計(jì)模式解析-責(zé)任鏈模式
iOS設(shè)計(jì)模式解析-模板方法
iOS設(shè)計(jì)模式解析-策略模式
iOS設(shè)計(jì)模式解析-享元模式
iOS設(shè)計(jì)模式解析-代碼地址

抽象工廠

抽象工廠:定義一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定他們具體的類谱净。

抽象工廠和工廠的比較

抽象工廠

  • 通過對象組合創(chuàng)建抽象產(chǎn)品
  • 創(chuàng)建多系列產(chǎn)品
  • 必須修改父類的接口才能支持新的產(chǎn)品

工廠方法

  • 通過類繼承創(chuàng)建抽象產(chǎn)品
  • 創(chuàng)建一種產(chǎn)品
  • 子類話創(chuàng)建者并重載工廠方法以創(chuàng)建新產(chǎn)品

軟件設(shè)計(jì)的黃金法則:變動(dòng)需要抽象衩匣。
如果有多個(gè)類共有相同的行為,但實(shí)際實(shí)現(xiàn)不同,則可能需要某種抽象類型作為其父類被繼承洁闰。

產(chǎn)品由兩個(gè)不同的品牌工廠AcmeBrandingFactorySierraBrandingFactory來“生產(chǎn)”,他們各自重載抽象BrandingFactory類中定義的工廠方法brandedView洋只、brandedMainButton划乖、brandedToolbar贬养,并根據(jù)工廠設(shè)計(jì)所針對的品牌返回具體產(chǎn)品。

超類的類方法factory是返回具體BrandingFactory的正確版本的工廠方法琴庵、其子類不應(yīng)重載這個(gè)方法(盡管子類能夠這么做)误算,factory方法根據(jù)當(dāng)前的編譯配置返回一個(gè)具體品牌工廠的實(shí)例(個(gè)人理解:可以根據(jù)條件不同返回一個(gè)具體品牌工廠的實(shí)例)

BrandingFactory
#import <Foundation/Foundation.h>
#import<UIKit/UIKit.h>

@interface BrandingFactory : NSObject

+ (BrandingFactory *) factory;

- (UIView *) brandedView;
- (UIButton *) brandedMainButton;
- (UIToolbar *) brandedToolbar;

@end
#import "BrandingFactory.h"
#import "AcmeBrandingFactory.h"
#import "SierraBrandingFactory.h"


@implementation BrandingFactory

+ (BrandingFactory *) factory
{
#if defined (USE_ACME)
    return [[[AcmeBrandingFactory alloc] init] autorelease];
#elif defined (USE_SIERRA)
    return [[[SierraBrandingFactory alloc] init] autorelease];
#else
    return nil;
#endif
}

- (UIView *) brandedView
{
    return nil;
}

- (UIButton *) brandedMainButton
{
    return nil;
}

- (UIToolbar *) brandedToolbar
{
    return nil;
}

@end

factory類方法中,使用預(yù)處理器定義告訴編譯器讓這個(gè)方法返回哪個(gè)具體工廠迷殿。如果定義了宏USE_ACME儿礼,那么運(yùn)行時(shí)會(huì)使用語句

return [[[AcmeBrandingFactory alloc] init] autorelease];

如果定義了宏USE_SIERRA,那么運(yùn)行時(shí)會(huì)使用語句

return [[[SierraBrandingFactory alloc] init] autorelease];

此外的其他情況贪庙,此方法會(huì)返回nil

AcmeBrandingFactory
#import <Foundation/Foundation.h>
#import "BrandingFactory.h"

@interface AcmeBrandingFactory : BrandingFactory

- (UIView *) brandedView;
- (UIButton *) brandedMainButton;
- (UIToolbar *) brandedToolbar;

@end

AcmeBrandingFactory繼承基類BrandingFactory蜘犁,并重載其工廠方法為此品牌生產(chǎn)正確的UI元素,原始的factory類方法沒有被重載止邮,因?yàn)樗居糜诟割悇?chuàng)建具體BrandingFactory的實(shí)例这橙,但是我們無法防止類方法被子類重載。

#import "AcmeBrandingFactory.h"
#import "AcmeView.h"
#import "AcmeMainButton.h"
#import "AcmeToolbar.h"


@implementation AcmeBrandingFactory

- (UIView *) brandedView
{
    // returns a custom view for Acme
    return [[AcmeView alloc] init];
}

- (UIButton *) brandedMainButton
{
    // returns a custom main button for Acme
    return [[AcmeMainButton alloc] init];
}

- (UIToolbar *) brandedToolbar
{
    // returns a custom toolbar for Acme
    return [[AcmeToolbar alloc] init];
}

@end

每個(gè)工廠方法的實(shí)現(xiàn)返回反映實(shí)際品牌的Acme*產(chǎn)品的實(shí)例导披。

SierraBrandingFactory
#import <Foundation/Foundation.h>
#import "BrandingFactory.h"

@interface SierraBrandingFactory : BrandingFactory

- (UIView*) brandedView;
- (UIButton*) brandedMainButton;
- (UIToolbar*) brandedToolbar;

@end

#import "SierraBrandingFactory.h"
#import "SierraView.h"
#import "SierraMainButton.h"
#import "SierraToolbar.h"

@implementation SierraBrandingFactory

- (UIView*) brandedView
{
    // returns a custom view for Sierra
    return [[SierraView alloc] init];
}

- (UIButton*) brandedMainButton
{
    // returns a custom main button for Sierra
    return [[SierraMainButton alloc] init];
}

- (UIToolbar*) brandedToolbar
{
    // returns a custom toolbar for Sierra
    return [[SierraToolbar alloc] init];
}

@end

說明:當(dāng)現(xiàn)有的抽象工廠需要支持新產(chǎn)品時(shí)屈扎,需要向父類添加相應(yīng)的新工廠方法。這意味著也要修改其子類以支持新產(chǎn)品的新工廠方法

調(diào)用
- (void)viewDidLoad {
    [super viewDidLoad];
    BrandingFactory * factory = [BrandingFactory factory];
    
    //...
    UIView * view = [factory brandedView];
    //... put the view on a proper location in view
    
    //...
    UIButton * button = [factory brandedMainButton];
    //... put the button on a proper location in view
    
    //...
    UIToolbar * toolbar = [factory brandedToolbar];
}

注意:BrandingFactory * factory = [BrandingFactory factory];
此時(shí)調(diào)用只有這一句話撩匕,在這里要深入理解抽象工廠的定義:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口鹰晨,無需指定它們具體的類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市止毕,隨后出現(xiàn)的幾起案子模蜡,更是在濱河造成了極大的恐慌,老刑警劉巖扁凛,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忍疾,死亡現(xiàn)場離奇詭異,居然都是意外死亡谨朝,警方通過查閱死者的電腦和手機(jī)卤妒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字币,“玉大人则披,你說我怎么就攤上這事∠闯觯” “怎么了士复?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長共苛。 經(jīng)常有香客問我判没,道長蜓萄,這世上最難降的妖魔是什么隅茎? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任澄峰,我火速辦了婚禮,結(jié)果婚禮上辟犀,老公的妹妹穿的比我還像新娘俏竞。我一直安慰自己,他們只是感情好堂竟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布魂毁。 她就那樣靜靜地躺著,像睡著了一般出嘹。 火紅的嫁衣襯著肌膚如雪席楚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天税稼,我揣著相機(jī)與錄音烦秩,去河邊找鬼。 笑死郎仆,一個(gè)胖子當(dāng)著我的面吹牛只祠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扰肌,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼抛寝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曙旭?” 一聲冷哼從身側(cè)響起盗舰,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桂躏,沒想到半個(gè)月后钻趋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沼头,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年爷绘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进倍。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡土至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猾昆,到底是詐尸還是另有隱情陶因,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布垂蜗,位于F島的核電站楷扬,受9級特大地震影響解幽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烘苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一躲株、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镣衡,春花似錦霜定、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惰说,卻和暖如春磨德,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吆视。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工典挑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揩环。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓搔弄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丰滑。 傳聞我的和親對象是個(gè)殘疾皇子顾犹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容