美文网首页面试专题(重难点)
iOS 设计模式的应用 ③ 抽象工厂

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

作者: _涼城 | 来源:发表于2022-05-06 09:47 被阅读0次

    什么是抽象工厂

        抽象工厂模式(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 中声明的抽象工厂方法以生产产品。

    总结

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

    相关文章

      网友评论

        本文标题:iOS 设计模式的应用 ③ 抽象工厂

        本文链接:https://www.haomeiwen.com/subject/dxvayrtx.html