设计模式——简单工厂


设计模式简单工厂模式
 

1 前言

我们总说面向对象要有可维护性,可扩展性,可复用性。今天我们就来学习一种简单地设计模式--简单工厂模式(FACTORY)。通过面向对象的封装,继承和多态来降低程序的耦合度。下面就让我们来深入学习这个模式。

 

2 详述

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

我们来看一个简单的例子:一个有关计算器的例子,用户可以输入两个数和操作符号,然后得到结果,普通的思路的代码实例:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//进行运算操作
     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图:

\

操作方法协议接口:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
# import <foundation foundation.h= "" >
 
/*!
  *  操作方法协议接口
  *
  *  @since V1.0
  */
@protocol OperationProtocol <nsobject>
 
-( double )getResult;
 
@end </nsobject></foundation>

 

操作方法父类:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# import <foundation foundation.h= "" >
# import OperationProtocol.h
 
/*!
  *  操作方法父类
  *
  *  @since V1.0
  */
@interface Operation : NSObject<operationprotocol>
 
@property double firstNum; //第一个操作数
@property double secondNum; //第二个操作数
 
@end </operationprotocol></foundation>

 

加法实现类:

 

 

?
1
2
3
4
5
6
7
8
9
10
# import Operation.h
 
/*!
  *  加法实现类
  *
  *  @since V1.0
  */
@interface OperationAdd : Operation
 
@end

 

操作工厂类:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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>

 

客户端代码:

 

 

?
1
2
3
4
5
6
7
8
9
10
- (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值