iOS 设计模式的应用 ③ 抽象工厂

什么是抽象工厂

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂,其提供一个创建一系列相关或相互依赖对象的接口,而不必指定其具体类或创建的细节。抽象工厂模式常与原型模式、单例模式和其它设计模式一起使用。

一系列工厂及其相关产品之间的关系.png

抽象工厂与工厂方法的区别

抽象工厂 工厂方法
通过对象组合创建抽象产品 通过类继承创建抽象产品
创建多系列产品 创建一种产品
必须修改父类的接口才能支持新的产品 子类化创建者并重载工厂方法以创建新产品

什么时候使用抽象工厂

    当系统有多于一个的产品族,一个产品族里定义了多个产品,而系统只需要其中某一族的产品时。

抽象工厂的优缺点

优点

    当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点

    产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Factory 里加代码,又要在具体 Factory 的里面加代码。

抽象工厂的实现

主题切换

现在有 DarkLight 两套不同风格的主题,涉及 ViewButtonToolBar,其类名为:

  • DarkViewDarkButtonDarkToolBar
  • 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 实体类

    @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 实体类

    @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. 获取对应主题

     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 框架广泛使用的一种设计模式。类簇将许多私有的具体子类组合在一个公共抽象超类之下。以这种方式对类进行分组简化了面向对象框架的公开可见架构,而不会降低其功能丰富性。

    为了说明类簇架构及其好处,请考虑构建类层次结构的问题,该层次结构定义对象以存储不同类型的数字(charintfloatdouble)。因为不同类型的数量具有许多共同特征(例如,它们可以从一种类型转换为另一种类型,并且可以表示为字符串),所以它们可以由单个类表示。但是,它们的存储要求不同,因此用同一个类来表示它们是低效的。

cluster2.gif

    NSNumber 有很多 numberWith* 方法,它们都是类方法,根据传入参数生成各种 NSNumber 的实例。如何创建 NSNumber 的具体子类型的实例都是由 NSNumber 的类方法负责,由于其是在类级别提供了方法以达到类似的效果,也成为类工厂方法

    类簇基于抽象工厂设计模式,比如 NSNumber 本身是一个高度抽象的工厂,而 NSCFBooleanNSCFNumber 是具体工厂子类。子类是具体工厂,因为它们重载了 NSNumber 中声明的抽象工厂方法以生产产品。

总结

    抽象工厂模式可以涉及许多类型的对象创建,提供其抽象而不暴露创建过程中任何不必要的细节或所创建对象的确切类型。在抽象工厂模式中增加新的系列,直接扩展一个工厂子类及对应的抽象子类,对整个模式框架不会带来其他影响。如果增加一个新的类型,创建新的类型对应的类,并对整个抽象工厂类及其子类进行方法扩展。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容