1、简单工厂模式简述

  • 简单工厂模式(FACTORY),通过面向对象的封装,继承和多态来降低程序的耦合度。将一个具体类的实例化交给一个静态工厂方法来执行。

2、简单工厂模式角色划分

  • 工厂类:包含了创建具体类的静态方法,负责生产;
  • 抽象产品:定义简单工厂中要返回的产品;用抽象类表示,由于OC中无抽象类的概念,可以使用协议(Protocol)来表示;
  • 具体产品:具体生产的产品。是抽象产品的子类(继承自抽象类),在OC中就是遵守上述协议(Protocol)

3、简单工厂模式类图

  • 简单工厂模式

4、简单工厂模式示意代码

  • 抽象产品:YCar

    1
    2
    3
    @protocol YCar <NSObject>
    - (void)run;
    @end
  • 具体产品:YAudiYBenzYLandRover

    • .h文件
      1
      2
      3
      4
      5
      6
      7
      8
      @interface YAudi : NSObject <YCar>
      @end

      @interface YBenz : NSObject <YCar>
      @end

      @interface YLandRover : NSObject <YCar>
      @end
    • .m文件
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      @implementation YAudi
      - (void)run {
      NSLog(@"奥迪车跑起来了");
      }
      @end

      @implementation YBenz
      - (void)run {
      NSLog(@"奔驰车跑起来了");
      }
      @end

      @implementation YLandRover
      - (void)run {
      NSLog(@"路虎车跑起来了");
      }
      @end
  • 工厂类:YCarFactory

    • YCarFactory.h
      1
      + (id<YCar>)creatCarWithCarType:(YCarType)carType;
    • YCarFactory.m
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      + (id<YCar>)creatCarWithCarType:(YCarType)carType {
      switch (carType) {
      case YCarTypeAudi:
      return [[YAudi alloc] init];
      break;
      case YCarTypeBenz:
      return [[YBenz alloc] init];
      break;
      case YCarTypeLandRover:
      return [[YLandRover alloc] init];
      break;

      default:
      return nil;
      break;
      }
      }
  • Client使用

    1
    2
    3
    4
    id<YCar> car = [YCarFactory creatCarWithCarType:YCarTypeBenz];
    [car run];

    // 运行结果:奔驰车跑起来了

5、简单工厂模式总结

  • 优点

    • 工厂类内部含有创建具体产品的逻辑,外界只需要向工厂类请求所需的产品即可,不需要关心产品实现细节;
  • 缺点

    • 工厂类内部集中了创建具体产品的逻辑,假如我们需要新添加一种产品,就要修改工厂类,进行参数判断,无法使用其子类继承进行扩展
  • 完整Demo