iOS设计模式-工厂方法

工厂方法

工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

工厂方法的使用场景

  1. 编译时无法准确预期要创建的对象的类;
  2. 类想让子类决定在运行时创建什么;
  3. 类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部话;

工厂方法在CocoaTouch中的应用

在Objective-C中两步对象创建法[[SomeClass alloc] init].但是还有一些便利的创建方法。例如,NSNumber有很多numberWith*方法;其中有两个是numberWithBool:和numberWithChar:。它们是类方法,也就是说我们向NSNumber发送[[NSNumber numberWithBool:bool]]与[[NSNumber numberWithChar:char]],以获得与传入参数同类型的各种NSNumber实例。与如何创建NSNumber的具体子类型的实例有关的细节,都有NSNumber的类工厂方法负责。[[NSNumber numberWithBool:bool]]的情况是,方法接受值bool,并把NSNumber的内部子类的一个实例初始化,让它能够反应传入的值。

工厂方法在Objective-C中的实现

1、定义通过工厂方法创建的类的统一父类(例如:Animal)和通过工厂方法创建的各个类(例如:Dog、Cat等),并为各个子类提供初始化细节。

//通过工厂方法创建类的实现举例
- (id)initWithName:(NSString*)name{
  if(self = [super init]){
    self.name = name;
    //添加初始化相关细节
    ...
  }
  return self;
 }

2、定义生成器父类(例如:AnimalGenerator)和各个生成器子类(例如:DogGenerator、CarGenerator)。

3、生成器父类中创建工厂方法、各个生成器子类中重载该方法

//AnimalGenerator中工厂方法
- (Animla*)animalWithName:(NSString*)name{
  return [[Animal alloc] initWithName:name];
}

//DogGenerator对AnimalGenerator中工厂方法的重载
- (Animal*)animalWithName:(NSString*)name{
  return [[Dog alloc] initWitName:name];
}

4、使用

DogGenerator *dogGenerator = [[DogGenerator alloc] init];
//不同生成器创建不同的动物
Animal *dog = [[dogGenerator animalWithName:@"小七"]];

你可能感兴趣的:(设计模式,ios)