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 ...
随机推荐
- 分享阿里云推荐码 IC1L2A,购买服务器可以直接打9折,另附阿里云服务器部署ASP.NET MVC5关键教程
阿里云推荐码为:IC1L2A 阿里云还是不错滴. 以windows server 2008 R2为例,介绍如何从全新的服务器部署MVC5 站点. 新购买的阿里云服务器是没有IIS的,要安装IIS: 控 ...
- web前端的春天 or 噩梦
「 微信应用号可以做什么」 简单说,微信"小程序"可以为开发者提供基于微信的表单.导航.地图.媒体和位置等开发组件,让他们在微信的网页里构建一个 HTML 5 应用.同时微信还开放 ...
- SQL Server 索引和表体系结构(聚集索引)
聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在各个网站上面也有很多关于这方面写的不错的文章,我写这篇文章的目的也是为了将所有的知识点尽可能的组 ...
- RabbitMQ的安装过程
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 网上一些安装教程都较为繁琐,实际上只需要两个RPM包,几分钟即可完成一台实例部署. 准备下载Erlang包: ht ...
- 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘
本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...
- JRebel Windows RegCreateKeyEx(...) returned error code 5.
作为一个JRebel的深度用户,在win10下用JRebel的eclipse插件使用的时候遇到了如下问题: java.util.prefs.WindowsPreferences <init> ...
- 简单的ViewPager了解Scroller类
View滑动是自定义ViewGroup中十分常见的一个功能.Android提供了多种View滑动的方法. layout方法 offsetLeftAndRight()与offsetTopAndBotto ...
- MySql中in和exists效率
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的 ...
- AngularJs之七
今天接着说angularJs服务,但今天专注说一下http服务. 一:$http 是 AngularJS 应用中最常用也是最核心的服务. 服务向服务器发送请求,应用响应服务器传送过来的数据. < ...
- WCF学习之旅—实现支持REST客户端应用(二十四)
WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...