IOS之Objective-C学习 工厂模式
工厂模式在父类里声明(可实现)创建对象的一个接口,让子类决定实例化哪个类,也就是说让一个类的实例化延迟到子类中生产。
工厂模式一般用于在不同地方创建对象和项目部署依赖多个数据库的时候。
工厂模式有三种,简单工厂,工厂方法, 抽象工厂。
简单工厂就是:工厂模式所创建的对象都是具体产品的实例。从以下的实例来看。
我以一个简单的计算器Demo来介绍一下简单工厂。
首先搭建界面如图:

创建以下类:
Operation.h
#import <Foundation/Foundation.h>
@interface Operation : NSObject
@property(nonatomic,assign)double firstNum;
@property(nonatomic,assign)double secondNum;
-(double)operate;
@end
Operation.m
#import "Operation.h"
@implementation Operation
-(double)operate{
return 0;
}
@end
Add.h
#import "Operation.h"
@interface Add : Operation
@end
Add.m
#import "Add.h"
@implementation Add
-(double)operate{
double result=0;
result=self.firstNum+self.secondNum;
return result;
}
@end
Minus.h,Minus.m,Multiplication.h,Multiplication.m,Division.h,Division.m与Add.h Add.m相类似。
创建工厂类
OperationFactory.h
#import <Foundation/Foundation.h>
#import "Add.h"
#import "Multiplication.h"
#import "Minus.h"
#import "Division.h"
#import "Operation.h"
@interface OperationFactory : NSObject
-(Operation*)runOperation:(NSString*)operatorStr;
@end
OperationFactory.m
#import "OperationFactory.h"
@implementation OperationFactory
-(Operation*)runOperation:(NSString*)operatorStr{
Operation *op=nil;
if ([operatorStr isEqualToString:@"+"]) {
op=[[Add alloc]init];
}
else if ([operatorStr isEqualToString:@"-"]){
op=[[Minus alloc]init];
}
else if ([operatorStr isEqualToString:@"*"]){
op=[[Multiplication alloc]init];
}
else if ([operatorStr isEqualToString:@"/"]){
op=[[Division alloc]init];
}
return op;
}
@end
实现代码如图

运行之后就能够做一些简单的计算了,并未考虑除数等其他因素,只是为了简单的介绍一下简单工厂。
接下来来说说工厂方法,工厂方法体现一种扩展的对象创建方式,很好地符合了开放封闭原则,也叫做虚构造器。说白了工厂方法就是使用了OOP的多态性,通过父类的创建方法创建出不同的子类对象。
我还是通过一个飞机工厂的Demo来实例解释一下工厂方法。
需要创建6个类,其中Bomber和helicopter类是Air的子类,BomberFactory和helicopterFactory类是AirFactory的子类。
Air.h
#import <Foundation/Foundation.h>
@interface Air : NSObject
-(void)fire;
@end
Air.m
import "Air.h"
@implementation Air
-(void)fire{
NSLog(@"Air fire");
}
@end
bomber.h
#import "Air.h"
@interface bomber : Air
-(void)fire;
@end
bomber.m
#import "bomber.h"
@implementation bomber
-(void)fire{
NSLog(@"bomber fire");
}
@end
helicopter.h
#import "Air.h"
@interface helicopter : Air
-(void)fire;
@end
helicopter.m
#import "helicopter.h"
@implementation helicopter
-(void)fire{
NSLog(@"helicopter fire");
}
@end
AirFactory.h
#import <Foundation/Foundation.h>
@class Air;
@interface AirFactory : NSObject
-(Air*)productAirs;
@end
AirFactory.m
#import "AirFactory.h"
@implementation AirFactory
-(Air*)productAirs{
return nil;
}
@end
bomberFactory.h
#import "AirFactory.h"
@interface bomberFactory : AirFactory
-(Air*)productAirs;
@end
bomberFactory.m
#import "bomberFactory.h"
#import "bomber.h"
@implementation bomberFactory
-(Air*)productAirs{
return [[bomber alloc]init];
}
@end
helicopterFactory.h
#import "AirFactory.h"
@interface helicopterFactory : AirFactory
-(Air*)productAirs;
@end
helicopterFactory.m
#import "helicopterFactory.h"
#import "helicopter.h"
@implementation helicopterFactory
-(Air*)productAirs{
return [[helicopter alloc]init];
}
@end
最后实现代码:
#import "ViewController.h"
#import "Air.h"
#import "AirFactory.h"
#import "bomber.h"
#import "bomberFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
AirFactory *airf=[[bomberFactory alloc]init];
Air *a=[airf productAirs];
[a fire];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
运行结果为
bomber fire
工厂方法将类与类之间更好的分层,这样有利于程序功能的补充,代码也变得简洁干净。
最后说说抽象工厂,我的理解就是抽象工厂是一种生产“类“的工厂模式,例如生产UIButton,UIView等UI控件。抽象工厂和工厂方法的区别在于抽象工厂是需要创建一个或多个对象类的时候被使用,而工厂方法则是创建一个具体实例的时候被使用。
IOS之Objective-C学习 工厂模式的更多相关文章
- 基于go语言学习工厂模式
工厂模式 简单工厂模式(Simple Factory) 定义 优点 缺点 适用范围 代码实现 工厂方法模式(Factory Method) 定义 优点 缺点 适用范围 代码实现 抽象工厂模式(Abst ...
- IOS设计模式浅析之简单工厂模式(SimpleFactory)
概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...
- [javaSE] 看知乎学习工厂模式
factory的“本质”就是根据不同的输入创建出不同类型的对象. 引入factory的原因就是你需要根据不同的输入创建不同类型的对象. 简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无 ...
- C++模式学习------工厂模式
工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- 从BWM生产学习工厂模式
工厂模式应用非常之广,在JDK底层源码以及各大主流框架中随处可见,一般以Factory结尾命名的类,比如Mybatis中的SqlSessionFactory,Spring中的BeanFactory等, ...
- iOS:个人浅谈工厂模式
一.什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行.工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好 ...
- 设计模式学习——工厂模式(Factory Pattern)
1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...
- 由XML解析学习工厂模式
代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupData ...
随机推荐
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)
CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...
- 到爱尔兰敲代码 / Come, Coding in Ireland
这是我在都柏林的第四个月,该办的证也都办完了,该安定下来的也安定下来了,所以也简单介绍下到爱尔兰做IT的相关过程和政策. 如果有兴趣在英语环境工作的话,我也可以帮忙推荐或者找找. 去年15年1月正好开 ...
- 【MSP是什么】MSP认证之项目群管理学习心得
学习了项目群管理后,我深受启发,在此发表下自己的一些个人感想. 项目群是指经过协调统一管理以便获取单独管理时无法取得的效益和控制的一组相互联系的项目. 项目群中的项目需要共享组织的资源, 需要进行项目 ...
- python资料
Python进阶 https://pythontips.com/ https://flyouting.gitbooks.io/learn-python-the-hard-way-cn/content/ ...
- MVC5网站开发之一 总体概述
由于前几次都没能写完,这次年底总算有自由时间了,又想继续捣鼓一下.于是下载了VS 2015专业版(不知为什么我特别钟爱专业版,而不喜欢企业版).由于以前的教训,我这次决定写一个极简的Deom,简到什么 ...
- 理清JavaScript正则表达式--下篇
紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是search.replace.match和s ...
- HTML5 学习总结(一)——HTML5概要与新增标签
一.HTML5概要 1.1.为什么需要HTML5 HTML4陈旧不能满足日益发展的互联网需要,特别是移动互联网.为了增强浏览器功能Flash被广泛使用,但安全与稳定堪忧,不适合在移动端使用(耗电.触摸 ...
- 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
pandas 对象拥有一些常用的数学和统计方法. 例如,sum() 方法,进行列小计: sum() 方法传入 axis=1 指定为横向汇总,即行小计: idxmax() 获取最大值对应的索 ...
- 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(五)
(五)注册Website Cloud 1 注册Website Cloud 添加Website Cloud 连接Website Cloud 注意, endpoint 是使用Management Se ...