一,工厂方法模式
工厂方法模式:定义创建对象的接口,让子类决定实例化那一个类。工厂方法使得类的实例化延迟到其子类。
静态类结构图:
Product:产品抽象类,定义产品对象的创建接口。
ConcreteProduct:实现Product接口的具体产品类。
Creator:定义返回Product对象的工厂方法,也可以提供工厂方法的默认实现。
ConcreteCreator:Creator子类,重载了工厂方法。返回ConcreteProduct对象。
二,工厂方法的使用场景
1,编译时无法准确预期要创建的对象的类;
2,类想让子类决定运行时创建什么对象;
3,类有若干个辅助子类,开发者希望将返回哪个子类这个信息局部化;
使用工厂方法模式最低限度时,工厂方法能够给予类在变更返回哪一种对象这个问题上更多的灵活性。适用情况:“一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。”
三,工厂方法创建对象更加安全
和直接创建新对象相比,工厂方法模式让客户程序可以要求由工程方法创建的对象有一组共同的行为。这样往类层次结构中引入新的具体产品并不需修改客户端代码,因为返回任何具体对象的接口根客户端一直使用的接口相同。
四,代码
接下来我们用代码演示一下:
@interface ZGYShape : NSObject
- (void)draw;
@end
@implementation ZGYShape
- (void)draw{
if ([self isKindOfClass:[ZGYShape class]]) {
NSLog(@"ZGYShape类的draw方法");
}else{
[NSException raise:NSInternalInconsistencyException
format:[NSString stringWithUTF8String:object_getClassName(self)],NSStringFromSelector(_cmd)];
NSLog(@"ZGYShape子类调用了draw方法,子类没有重写draw方法,属于异常!");
}
}
@end
@interface ZGYCircleShape : ZGYShape
@end
@implementation ZGYCircleShape
- (void)draw{
NSLog(@"绘制一个圆形");
}
@end
@interface ZGYSquareShape : ZGYShape
@end
@implementation ZGYSquareShape
- (void)draw{
NSLog(@"绘制一个方形");
}
@end
#import "ZGYShape.h"
@interface ZGYShapeFactory : NSObject
- (ZGYShape *)factoryMethod;
@end
@implementation ZGYShapeFactory
- (ZGYShape *)factoryMethod{
[NSException raise:NSInternalInconsistencyException
format:[NSString stringWithUTF8String:object_getClassName(self)],NSStringFromSelector(_cmd)];
return nil;
}
@end
@interface ZGYCircleShapeFactory : ZGYShapeFactory
@end
#import "ZGYCircleShape.h"
@implementation ZGYCircleShapeFactory
- (ZGYShape *)factoryMethod{
return [[ZGYCircleShape alloc]init];
}
@end
@interface ZGYSquareShapeFactory : ZGYShapeFactory
@end
#import "ZGYSquareShape.h"
@implementation ZGYSquareShapeFactory
- (ZGYShape *)factoryMethod{
return [[ZGYSquareShape alloc]init];
}
@end
#import "ZGYShape.h"
#import "ZGYCircleShapeFactory.h"
#import "ZGYSquareShapeFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//工厂对象
ZGYCircleShapeFactory * circleShapeFactory = [[ZGYCircleShapeFactory alloc]init];
ZGYSquareShapeFactory * squareShapeFactory = [[ZGYSquareShapeFactory alloc]init];
//产品对象
ZGYShape * circleShape = [circleShapeFactory factoryMethod];
ZGYShape * squareShape = [squareShapeFactory factoryMethod];
//查看对象
[circleShape draw];
[squareShape draw];
}
@end
最终的打印输出
2017-09-30 22:57:14.399386+0800 设计模式(工厂方法模式)[63815:21286029] 绘制一个圆形
2017-09-30 22:57:14.399486+0800 设计模式(工厂方法模式)[63815:21286029] 绘制一个方形