设计模式02--工厂方法模式
0、序
在简单工厂模式中,我们总结了简单工厂模式的优缺点,如下:
优点
- 工厂类内部含有创建具体产品的逻辑,外界只需要向工厂类请求所需的产品即可,不需要关心产品实现细节;
缺点
- 工厂类内部集中了创建具体产品的逻辑,假如我们需要新添加一种产品,就要修改工厂类,进行参数判断,
无法使用其子类继承进行扩展
。
- 工厂类内部集中了创建具体产品的逻辑,假如我们需要新添加一种产品,就要修改工厂类,进行参数判断,
所以工厂方法模式
出现了。
1、工厂方法模式简述
- 简而言之就是,将
简单工厂模式
中的工厂类
继续抽象。
2、工厂方法模式角色划分
抽象工厂
- 从工厂类中抽象出来一个接口,这个接口只有一个方法,也就是用于
创建抽象产品的工厂方法
,用抽象类
表示,由于OC中无抽象类的概念,使用协议(Protocol)
来表示;
- 从工厂类中抽象出来一个接口,这个接口只有一个方法,也就是用于
具体工厂
- 负责生产具体的产品;
抽象产品
- 工厂中要返回的产品,用
抽象类
表示,由于OC中无抽象类的概念,使用协议(Protocol)
来表示;
- 工厂中要返回的产品,用
具体产品
- 供外界使用的具体的产品;
3、工厂方法模式UML类图
4、工厂方法模式示意代码
抽象产品:
YCar
1
2
3@protocol YCar <NSObject>
- (void)run;
@end具体产品:
YAudi
、YBenz
- .h文件
1
2
3
4
5@interface YAudi : NSObject <YCar>
@end
@interface YBenz : NSObject <YCar>
@end - .m文件
1
2
3
4
5
6
7
8
9
10
11@implementation YAudi
- (void)run {
NSLog(@"奥迪车跑起来了");
}
@end
@implementation YBenz
- (void)run {
NSLog(@"奔驰车跑起来了");
}
@end
- .h文件
抽象工厂:
YAbsFactory
1
2
3@protocol YAbsFactory <NSObject>
+ (id<YCar>)creatCar;
@end具体工厂:
YAudiFactory
、YBenzFactory
- .h文件
1
2
3
4
5
6
7// Audi汽车工厂
@interface YAudiFactory : NSObject <YAbsFactory>
@end
// Benz汽车工厂
@interface YBenzFactory : NSObject <YAbsFactory>
@end - .m文件
1
2
3
4
5
6
7
8
9
10
11@implementation YAudiFactory
+ (id<YCar>)creatCar {
return [[YAudi alloc] init]; // 生产Audi汽车
}
@end
@implementation YBenzFactory
+ (id<YCar>)creatCar {
return [[YBenz alloc] init]; // 生产Benz汽车
}
@end
- .h文件
Client使用
1
2
3
4
5
6
7
8
9id<YCar> car1 = [YAudiFactory creatCar];
[car1 run];
id<YCar> car2 = [YBenzFactory creatCar];
[car2 run];
// 运行结果:
奥迪车跑起来了
奔驰车跑起来了扩展:新加的需求一辆保时捷轿车
- 创建保时捷汽车具体产品类:
YPorsche
,遵守Ycar
协议; - 创建保时捷汽车具体工厂类:
YPorscheFactory
,遵守YAbsFactory
协议,实现+ (id<YCar>)creatCar
工厂方法,内部创建一个具体的保时捷汽车(YPorsche实例);
- 创建保时捷汽车具体产品类:
5、工厂方法模式总结
工厂方法模式就是将工厂类抽象出一个接口(抽象工厂类),接口内只有一个方法,也就是创建
抽象产品
的方法,然后使其子类具体工厂去创建具体的产品;与简单工厂的区别:(需要新添加别的具体产品的场景)
- 简单工厂模式:需要修改工厂方法,添加参数进行判断;
- 工厂方法模式:不需要修改工厂方法,只需添加新的具体产品类和生产这个具体产品的具体工厂类;