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 ...
随机推荐
- 全面解析ASP.NET MVC模块化架构方案
什么叫架构?揭开架构神秘的面纱,无非就是:分层+模块化.任意复杂的架构,你也会发现架构师也就做了这两件事. 本文将会全面的介绍我们团队在模块化设计方面取得的经验.之所以加了“全面”二字,是因为本文的内 ...
- 使用CSS3的box-shadow实现双透明遮罩层对话框
box-shadow介绍 在我之前的一篇文章<从天猫和支付宝身上学习opcity与rgba>中,介绍了实现双透明遮罩层效果的两种方法,分别是opacity和rgba.他们需要分别依赖于不同 ...
- 在 Linux 中使用 Eclipse 和 Gnu Autotools 管理 C/C++ 项目
在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 U ...
- ABP源码分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...
- java类的加载机制
什么是类装载器ClassLoader ClassLoader是一个抽象类 ClassLoader的实例将读入Java字节码将类装载到JVM中 ClassLoader可以定制,满足不同的字节码流获取方式 ...
- .NET Core下的日志(1):记录日志信息
记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关A ...
- angular2系列教程(五)Structural directives、再谈组件生命周期
今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, n ...
- 坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)
上一篇:<坎坷路:ASP.NET 5 Identity 身份验证(上集)> ASP.NET Core 1.0 什么鬼?它是 ASP.NET vNext,也是 ASP.NET 5,以后也可能 ...
- DotLiquid模板引擎简介
DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...
- 【Android】 修复ijkPlayer进行m3u8 hls流播放时seek进度条拖动不准确的问题
项目中使用的播放器是ijkPlayer,发现播放切片特点的hls流(m3u8格式的视频)拖动seekBar的时候会莫名的跳转或者seek不到准确的位置,发现网友也遇到了同样的问题,ijk的开发者也说明 ...