概念
工厂方法模式(Factory Method Pattern)在基类中建立一个抽象方法,子类可以通过改写这一方法来改变创建对象的具体过程。工厂方法模式让子类来决定如何创建对象,来达到封装的目的。
实例
接下来还是使用计算器的例子,我们先实现一个工厂协议 CalculateFactoryProtocol 返回一个计算处理类:
@class Calculate;
@protocol CalculateFactoryProtocol <NSObject>
+ (Calculate *)createCalculate;
@end
工厂实现
然后创建相应的用于创建生产计算方法处理类的工厂(都遵循 CalculateFactoryProtocol 协议),实现协议中的协议方法 createCalculate,返回一个计算处理父类,而所实例化的为各个计算处理方法类(都是继承自计算处理父类 Calculate):
AddFactory.h
#import <Foundation/Foundation.h>
#import "CalculateFactoryProtocol.h"
@interface AddFactory : NSObject <CalculateFactoryProtocol>
@end
AddFactory.m
#import "AddFactory.h"
#import "Calculate_Add.h"
@implementation AddFactory
+ (Calculate *)createCalculate {
return [[Calculate_Add alloc] init];
}
@end
SubFactory.h
#import <Foundation/Foundation.h>
#import "CalculateFactoryProtocol.h"
@interface SubFactory : NSObject <CalculateFactoryProtocol>
@end
SubFactory.m
#import "SubFactory.h"
#import "Calculate_Sub.h"
@implementation SubFactory
+ (Calculate *)createCalculate {
return [[Calculate_Sub alloc] init];
}
@end
调用
Calculate *calculate_add = [AddFactory createCalculate];
calculate_add.firstNum = 3.0f;
calculate_add.secondNum = 6.0f;
NSLog(@"工厂方法模式-求和:%f",[calculate_add getResult]);
Calculate *calculate_sub = [SubFactory createCalculate];
calculate_sub.firstNum = 9.0f;
calculate_sub.secondNum = 3.0f;
NSLog(@"工厂方法模式-求差:%f",[calculate_sub getResult]);
执行结果:
执行结果
从对象的创建来讲,这个将对象的创建扩展到了对象子类,从设计原则中中的依赖角度来看,原来的工厂需要依赖的各种具体的服装子类的引用,现在将这些进行各种分类,这里是以工厂的形式进行分类,抽象组件不依赖于具体的实现组件,已经完成的扩展可以不需要变化,如果有新增需求只需要增加新的功能接口,高层组件不需要太大的变化。