简单工厂模式
正如此模式的名称一样,简单工厂模式基本上是所有设计模式里最简单的一种,类与类之间的关系一目了然。这次我就用很多地方经常举的例子--计算器,来说明这个模式。首先给大家展示一下类之间的结构图:
通过这张结构图,可以清晰的看到,加法类、减法类、乘法类、除法类继承自运算类,简单工厂类依赖于运算类的实例化来实现相应的运算功能,好的,看起来并不复杂,让我们直接展示一下代码吧(鉴于目前点点不支持Objective C的代码高亮,所以就直接写啦,尽量保持整齐吧。另,为了照顾像我一样基础不是很好的同学,我尽量把代码写全,方便大家调试)。
注意:本文所有代码均在ARC环境下编译通过。
首先是运算类(父类):
接口文件:
#import <Foundation/Foundation.h>@interface Operation :NSObject{ double numberA; double numberB; } @property double numberA; @property double numberB; -(double) GetResult; @end
#import"Operation.h"@implementation Operation @synthesize numberA, numberB;
-(double) GetResult{ return -1.0; //此处默认返回-1.0,无其他意义 }
@end
#import "Operation.h"@interface OperationAdd:Operation @end
#import "OperationAdd.h"@implementation OperationAdd
-(double) GetResult{ double result =0; result =numberA+numberB; return result; }
@end
#import "Operation.h" @interface OperationSub:Operation @end
#import "OperationSub.h"@implementation OperationSub
-(double)GetResult{ double result =0; result = numberA-numberB; return result; }
@end
#import "Operation.h" @interface OperationMul:Operation @end
#import "OperationMul.h"@implementation OperationMul
-(double)GetResult{ double result =0; result = numberA*numberB; return result; }
@end
#import "Operation.h"@interface OperationDiv:Operation @end
#import "OperationDiv.h"@implementation OperationDiv
-(double)GetResult{ double result =0; @try{ result = numberA/numberB; } @catch(NSException *exception) { NSLog(@"除数不能为0"); } return result; }
@end
#import <Foundation/Foundation.h> #import "OperationAdd.h" #import "OperationDiv.h" #import "OperationSub.h" #import "OperationMul.h"@interface OperationFactory:NSObject +(Operation*)CreateOperate:(char)operate; @end
#import "OperationFactory.h"+(Operation*)CreateOperate:(char)operate{ Operation *oper; switch(operate) { case '+': oper = [[OperationAdd alloc]init]; break; case '-': oper = [[OperationSub alloc]init]; break; case '*': oper = [[OperationMul alloc]init]; break; case '/': oper = [[OperationDiv alloc]init]; break; default: oper = nil; break; } return oper; }
#import <Foundation/Foundation.h> #import "OperationAdd.h" #import "OperationDiv.h" #import "OperationMul.h" #import "OperationSub.h" #import "OperationFactory.h"int main (int argc,const char* argv[]) { @autoreleasepool{ Operation *oper = [OperationFactory CreateOperate:'*']; [oper setNumberA:1]; [oper setNumberB:2]; double result = 0; result = [oper GetResult]; NSLog(@"Result is %f", result); } return 0; }
工厂方法模式
上面关于简单工厂模式中就有提到过一次关于“工厂类”模式。为了帮助大家能够回忆一下简单工厂模式,在这里提一下简单工厂模式的优点,简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。其实,工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是,由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
下面还是以计算器为例子,详细介绍工厂方法模式,还是老样子,先向大家展示一下类结构图。
上面这张图向大家展示了各个类之间的关系。其实和简单工厂模式不同的是,类图的右边抽象工厂接口是相比简单工厂模式多出来的抽象接口。
下面直接上代码吧,别的不多说了。
注意:本文所有代码均在ARC环境下编译通过。
Operation类接口
#import <Foundation/Foundation.h>@interface Operation :NSObject{ double numberA; double numberB; } @property double numberA; @property double numberB; -(double) GetResult; @end
#import "Operation.h"@implementation Operation @synthesize numberA, numberB; -(double) GetResult{ return -1.0; } @end
#import "Operation.h"@interface OperationAdd :Operation @end
#import "OperationAdd.h"@implementation OperationAdd -(double) GetResult{ double result =0; result = numberA+numberB; return result; } @end
#import "Operation.h"@interface OperationDiv :Operation @end
#import "OperationDiv.h"@implementation OperationDiv -(double)GetResult{ double result =0; @try{ result = numberA/numberB; } @catch(NSException *exception) { NSLog(@"除数不能为0"); } return result; } @end
#import "Operation.h"@interface OperationMul :Operation @end OperationMul类实现
#import "OperationMul.h"
@implementation OperationMul -(double)GetResult{ double result =0; result = numberA*numberB; return result; } @end
#import "Operation.h"@interface OperationSub :Operation @end
#import "OperationSub.h"@implementation OperationSub -(double)GetResult{ double result =0; result = numberA-numberB; return result; } @end
#import <Foundation/Foundation.h>#import "Operation.h" @interface IFactory :NSObject -(Operation*)CreateOperation; @end
#import "IFactory.h"@implementation IFactory -(Operation*)CreateOperation{ return [[Operation alloc]init]; } @end
#import "IFactory.h"@interface AddFactory :IFactory @end
#import "AddFactory.h" #import "OperationAdd.h"@implementation AddFactory -(Operation*)CreateOperation{ return [[OperationAdd alloc]init]; } @end
#import "IFactory.h"@interface SubFactory :IFactory @end
#import "SubFactory.h" #import "OperationSub.h"@implementation SubFactory -(Operation*)CreateOperation{ return [[OperationSub alloc]init]; } @end
#import "IFactory.h"@interface MulFactory :IFactory @end
#import "MulFactory.h" #import "OperationMul.h"@implementation MulFactory -(Operation*)CreateOperation{ return [[OperationMul alloc]init]; } @end
#import "IFactory.h"@interfaceDiv Factory :IFactory @end
#import "DivFactory.h" #import "OperationDiv.h"@implementation DivFactory -(Operation*)CreateOperation{ return [[OperationDiv alloc]init]; } @end
#import <Foundation/Foundation.h> #import "OperationAdd.h" #import "AddFactory.h" //加法工厂,你可以根据需要添加其他运算工厂int main (int argc,const char* argv[]) { @autoreleasepool{ IFactory *operFactory = [[AddFactory alloc]init]; Operation *oper = [operFactory CreateOperation]; [oper setNumberA:1]; [oper setNumberB:2]; double result = [oper GetResult]; NSLog(@"The result is %f", result); } return 0; }
本文向大家介绍Ruby中使用设计模式中的简单工厂模式和工厂方法模式,包括了Ruby中使用设计模式中的简单工厂模式和工厂方法模式的使用技巧和注意事项,需要的朋友参考一下 之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。 简单工厂模式: 这样写的好处是降低耦合。 比如增加一个开根号运算的时候,只需要在工厂类中添加一个分支
我正在学习新的设计模式 我编写了一个简单的工厂类,如下所示 我们创建Factory类,如下所示: 现在,当客户端想要添加名为IceCream的新项目时,他们只需创建名为IceCreamFactory的新工厂并从中创建IceCream,如下所示: 我的理解正确吗?我们在这里满足了开闭原则,但对于每个产品(项目),我们都需要一个工厂类,这不是一个可管理的噩梦吗? 注:我指的是一篇文章https://w
本文向大家介绍Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】,包括了Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下: 一、 简单工厂 先来思考一个问题。我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建
简单工厂(Simple Factory) Intent 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。 Class Diagram 简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。 这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所
本文向大家介绍java设计模式之简单工厂模式,包括了java设计模式之简单工厂模式的使用技巧和注意事项,需要的朋友参考一下 在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装);如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetResult()虚函数,这时添加新的运算只需要派生一个新的类,即不需要之前的运算参
工厂方法(Factory Method) Intent 定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 Class Diagram 在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。 下图中,Factory 有一个 doSomething() 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。
本文向大家介绍PHP设计模式之简单工厂和工厂模式实例分析,包括了PHP设计模式之简单工厂和工厂模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP设计模式之简单工厂和工厂模式。分享给大家供大家参考,具体如下: 工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮
本文向大家介绍Java设计模式编程中的工厂方法模式和抽象工厂模式,包括了Java设计模式编程中的工厂方法模式和抽象工厂模式的使用技巧和注意事项,需要的朋友参考一下 工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展。 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来