“专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。”
世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例。
ConcreteProduct1和ConcreteProduct2两个产品具有一个共同的父类IProject,简单工厂类为SimpleFactory,负责根据传入的不同参数来决定生产ConcreteProduct1还是ConcreteProduct2产品。
最经典的示例就是运算类,加、减、乘、除四个运算符都继承自父类Operation,有两个属性和一个操作方法,这些加减乘除的对象并不是直接在ViewController中创建,而是根据输入操作符,由简单工厂OperationFactory来创建。
(1)创建一个协议OprationProtocol,由父类Operation来遵从该协议
/*
* 操作方法协议接口
*/
@protocol OperationProtocol <NSObject>
-(double)getResult;
@end
(2)定义加减乘除操作的父类Operation
#import OperationProtocol.h
/*
* 操作方法父类
*/
@interface Operation : NSObject<operationprotocol>
@property double firstNum;//第一个操作数
@property double secondNum;//第二个操作数
@end
(3)加减乘除实现类,此处以”加”举例说明
//OperationAdd.h文件
#import Operation.h
/*
* 加法实现类
*/
@interface OperationAdd : Operation
@end
//OperationAdd.m文件
#import "OperationAdd.h"
@implementation OperationAdd
-(double)getResult
{
double result = 0;
result = self.firstNum+self.secondNum;//"+"是OperationAdd时候使用,"+-*/"分别对应"加减乘除"
return result;
}
@end
(4)简单工厂类的代码
//OpeartionFactory.h file
#import Operation.h
#import OperationAdd.h
#import OperationSub.h
#import OperationMultiply.h
#import OperationDivide.h
/*
* 操作工厂类
*/
@interface OperationFactory : NSObject
//获得操作对象
+(Operation*)createOperate:(NSString*)operateStr;
@end
//OpeartionFactory.m file
#import "OperationFactory.h"
@implementation OperationFactory
+(Operation*)createOperate:(NSString*)operateStr
{
Operation* oper = nil;
//根据不同的操作符,创建不同的操作对象,"+-*/"分别对应"加减乘除"
if ([operateStr isEqualToString:@"+"]) {
oper = [[OperationAdd alloc] init];
}else if ([operateStr isEqualToString:@"-"]){
oper = [[OperationSub alloc] init];
}else if ([operateStr isEqualToString:@"*"]){
oper = [[OperationMultiply alloc] init];
}else if ([operateStr isEqualToString:@"/"]){
oper = [[OperationDivide alloc] init];
}
return oper;
}
@end
(5)客户端代码,在ViewController中使用OperationFactory
NSString* strFirstNum = self.firstNumTextField.text;
NSString* strSecondNum = self.secondNumTextField.text;
Operation* oper;
oper = [OperationFactory createOperate:self.operationTextField.text];
oper.firstNum = [strFirstNum doubleValue];
oper.secondNum = [strSecondNum doubleValue];
self.resultTextField.text = [NSString stringWithFormat:@%f,[oper getResult]];
通过简单工厂模式的重构,我们就是闲了低耦合度的代码结构,做到了对外扩展开放,对修改关闭。如果再增加任何的操作方法,只需要继承操作方法父类,新建一个操作子类,并且在简单工厂类里面多添加一个else if的判断即可。
简单工厂方法从代码中消除了对应用程序特有类的耦合,调用者不必关心具体实现,取消了常建者的责任,实现了对责任的分割
工程类集中了所有产品的逻辑,一旦不能正常工作,整个系统受影响,当分类较多时,所有创建工作都在工厂方法中实现,后期扩展较为发杂
(1)工厂类负责创建的对象较少时;
(2)客户端只知道传入工厂类的参数,对于如何创建对象的逻辑不必关心时。
原文地址:http://blog.csdn.net/richard_rufeng/article/details/44834415