何为工厂方法模式
****工厂方法****也称为虚构造器(virtual constructor).
****适用情况****: 一个类无法预期需要生成哪个类的对象, 想让其子类来指定所生成的对象.
****如下图所示****:
![类图.png](http://oh73tojig.bkt.clouddn.com/2016112956117屏幕快照 2016-11-29 下午6.46.34.png)
****工厂方法模式****:定义创建对象的接口, 让子类决定实例化哪一个类. 工厂方法的实例化延迟到其子类.
何时使用工厂方法
- 编译时无法准确预期要创建的对象的类.
- 类想让其子类决定在运行时创建什么.
- 类有若干辅助类为其子类, 而你决定想返回哪个子类.
使用工行方法的好处
与直接创建新的具体对象相比, 使用工厂方法创建对象更加安全. 工厂方法模式, 可以要求有工厂方法创建的对象拥有一组共同的行为. 所以往类层次结构中引入新的具体产品并不需要修改客户端代码, 因为返回的任何具体对象的接口都跟客户端一直在用的从前的接口相同.
简单的使用
定义一个机械工厂类 MachineryFactory
#import <Foundation/Foundation.h>
@interface MachineryFactory : NSObject
+ (instancetype)factory;
- (NSObject *)bmwCar;
- (NSObject *)audiCar;
- (NSObject *)benzCar;
@end
#import "MachineryFactory.h"
#import "CarFactory.h"
@implementation MachineryFactory
+ (instancetype)factory {
return [[[self class]alloc] init];
}
- (NSObject *)bmwCar {
return nil;
}
- (NSObject *)benzCar {
return nil;
}
- (NSObject *)audiCar {
return nil;
}
定义一个汽车工厂类继承于机械工厂类 CarFactory
#import "MachineryFactory.h"
@interface CarFactory : MachineryFactory
- (NSObject *)bmwCar;
- (NSObject *)audiCar;
- (NSObject *)benzCar;
@end
#import "CarFactory.h"
#import "Audi.h"
#import "BMW.h"
#import "Benz.h"
@implementation CarFactory
+ (instancetype)factory {
return [[[CarFactory class] alloc] init];
}
- (NSObject *)bmwCar {
return [[BMW alloc]init];
}
- (NSObject *)benzCar {
return [[Benz alloc]init];
}
- (NSObject *)audiCar {
return [[Audi alloc]init];
}
@end
Audi.h, BMW.h, Benz.h 是具体的产品类.
![2016112936762屏幕快照 2016-11-29 下午8.10.47.png](http://oh73tojig.bkt.clouddn.com/2016112936762屏幕快照 2016-11-29 下午8.10.47.png)
使用:
CarFactory *carFactory = [CarFactory factory];
[carFactory bmwCar];
[carFactory benzCar];
[carFactory audiCar];
结论
当你需要很多个飞机产品的时候, 你只需要创建一个飞机工厂类继承于机械工厂类.
以上是我的个人感悟, 还请大神们多多指导, 哪里不对还请指正.
****PS:****如果觉得小弟写的还可以点个👍, 或者关注我, 以鼓励我更快的成长, 小弟在此感激不尽.