- 设计模式简单工厂模式
-
1 前言
我们总说面向对象要有可维护性,可扩展性,可复用性。今天我们就来学习一种简单地设计模式--简单工厂模式(FACTORY)。通过面向对象的封装,继承和多态来降低程序的耦合度。下面就让我们来深入学习这个模式。
2 详述
工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
我们来看一个简单的例子:一个有关计算器的例子,用户可以输入两个数和操作符号,然后得到结果,普通的思路的代码实例:
1234567891011121314151617181920212223242526//进行运算操作
if
([strOperation isEqualToString:@+]) {
NSLog(@+);
double
result = [strFirstNum doubleValue]+[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}
else
if
([strOperationisEqualToString:@-]){
NSLog(@-);
double
result = [strFirstNum doubleValue]-[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}
else
if
([strOperationisEqualToString:@*]){
NSLog(@*);
double
result = [strFirstNum doubleValue]*[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}
else
if
([strOperationisEqualToString:@/]){
NSLog(@/);
//判断除数不能为0
if
([strSecondNum isEqualToString:
@0
]) {
NSLog(@除数不能为
0
);
UIAlertView* tempAlert = [[UIAlertViewalloc] initWithTitle:@警告message:@除数不能为
0
delegate:nilcancelButtonTitle:@取消 otherButtonTitles:nil];
[tempAlert show];
}
else
{
double
result = [strFirstNum doubleValue]/[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}
}
上面代码确实可以实现这个功能,但是我们却没有考虑到:如果以后需要提供开平方运算,乘方运算扩展时候,改如何做呢?直接加个if else?如果加入了100种运算呢?如果这样去做是不是每次都要去改这部分代码,这样有悖我们可扩展性原则。所以我们需要引入简单工厂模式,把运算给抽象出来,并且加入运算工厂用于接收用户的操作,简单工厂方法代码:
UML图:
操作方法协议接口:
123456789101112#
import
<foundation foundation.h=
""
>
/*!
* 操作方法协议接口
*
* @since V1.0
*/
@protocol
OperationProtocol <nsobject>
-(
double
)getResult;
@end
</nsobject></foundation>
操作方法父类:
1234567891011121314#
import
<foundation foundation.h=
""
>
#
import
OperationProtocol.h
/*!
* 操作方法父类
*
* @since V1.0
*/
@interface
Operation : NSObject<operationprotocol>
@property
double
firstNum;
//第一个操作数
@property
double
secondNum;
//第二个操作数
@end
</operationprotocol></foundation>
加法实现类:
12345678910#
import
Operation.h
/*!
* 加法实现类
*
* @since V1.0
*/
@interface
OperationAdd : Operation
@end
123456789101112131415161718#
import
<foundation foundation.h=
""
>
#
import
Operation.h
#
import
OperationAdd.h
#
import
OperationSub.h
#
import
OperationMultiply.h
#
import
OperationDivide.h
/*!
* 操作工厂类
*
* @since V1.0
*/
@interface
OperationFactory : NSObject
//获得操作对象
+(Operation*)createOperate:(NSString*)operateStr;
@end
</foundation>
12345678910- (IBAction)clickingOperation:(id)sender {
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]];
}
通过简单工厂模式的重构,这样我们就实现了低耦合度的代码结构,做到了对扩展开放,对修改关闭。如果再增加任何的操作方法,只需要继承操作方法父类,新建一个操作子类,并且在工厂方法里面多加一个if else的判断即可。怎么样很简单吧。
3 结语
以上是所有内容,希望对大家有所帮助。
详细代码下载地址:
重构前:http://download.csdn.net/detail/u010013695/6944273
重构后:http://download.csdn.net/detail/u010013695/6944291
设计模式——简单工厂
最新推荐文章于 2024-08-16 08:57:25 发布