iOS 設(shè)計(jì)模式的應(yīng)用 ③ 抽象工廠

什么是抽象工廠

????抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠妙同,其提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口射富,而不必指定其具體類或創(chuàng)建的細(xì)節(jié)粥帚。抽象工廠模式常與原型模式、單例模式和其它設(shè)計(jì)模式一起使用芒涡。

一系列工廠及其相關(guān)產(chǎn)品之間的關(guān)系.png

抽象工廠與工廠方法的區(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)在有 DarkLight 兩套不同風(fēng)格的主題,涉及 View匠襟、ButtonToolBar钝侠,其類名為:

  • DarkView酸舍、DarkButtonDarkToolBar
  • LightViewLightButtonLightToolBar
  1. 定義 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
    
  2. 定義 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
    
    
  3. 定義 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
    
  4. 獲取對應(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状您、intfloat膏孟、double)眯分。因?yàn)椴煌愋偷臄?shù)量具有許多共同特征(例如柒桑,它們可以從一種類型轉(zhuǎn)換為另一種類型,并且可以表示為字符串)魁淳,所以它們可以由單個類表示飘诗。但是,它們的存儲要求不同疚察,因此用同一個類來表示它們是低效的蒸走。

cluster2.gif

????NSNumber 有很多 numberWith* 方法貌嫡,它們都是類方法,根據(jù)傳入?yún)?shù)生成各種 NSNumber 的實(shí)例岛抄。如何創(chuàng)建 NSNumber 的具體子類型的實(shí)例都是由 NSNumber 的類方法負(fù)責(zé)别惦,由于其是在類級別提供了方法以達(dá)到類似的效果夫椭,也成為類工廠方法

????類簇基于抽象工廠設(shè)計(jì)模式蹭秋,比如 NSNumber 本身是一個高度抽象的工廠扰付,而 NSCFBooleanNSCFNumber 是具體工廠子類仁讨。子類是具體工廠,因?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ò)展茉继。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚀乔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吉挣,更是在濱河造成了極大的恐慌派撕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件终吼,死亡現(xiàn)場離奇詭異镀赌,居然都是意外死亡际跪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門姆打,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幔戏,你說我怎么就攤上這事玛追∠醒樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵垒玲,是天一觀的道長邢笙。 經(jīng)常有香客問我侍匙,道長,這世上最難降的妖魔是什么想暗? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任妇汗,我火速辦了婚禮说莫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘储狭。我一直安慰自己互婿,他們只是感情好辽狈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刮萌,像睡著了一般驮配。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壮锻,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音猜绣,去河邊找鬼。 笑死掰邢,一個胖子當(dāng)著我的面吹牛验懊,可吹牛的內(nèi)容都是我干的尸变。 我是一名探鬼主播义图,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼碱工,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奏夫?” 一聲冷哼從身側(cè)響起怕篷,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤廊谓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后麻削,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸痹,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叠荠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扫责。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳖孤,死狀恐怖者娱,靈堂內(nèi)的尸體忽然破棺而出苏揣,到底是詐尸還是另有隱情,我是刑警寧澤腿准,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布际起,位于F島的核電站吐葱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弟跑。R本人自食惡果不足惜灾前,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一孟辑、第九天 我趴在偏房一處隱蔽的房頂上張望哎甲。 院中可真熱鬧饲嗽,春花似錦、人聲如沸貌虾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袄膏,卻和暖如春践图,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背码党。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斥黑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓心赶,卻偏偏與公主長得像扣讼,于是被迫代替她去往敵國和親缨叫。 傳聞我的和親對象是個殘疾皇子椭符,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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