工厂模式在父类里声明(可实现)创建对象的一个接口,让子类决定实例化哪个类,也就是说让一个类的实例化延迟到子类中生产。

工厂模式一般用于在不同地方创建对象和项目部署依赖多个数据库的时候。

工厂模式有三种,简单工厂,工厂方法, 抽象工厂。

简单工厂就是:工厂模式所创建的对象都是具体产品的实例。从以下的实例来看。

我以一个简单的计算器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学习 工厂模式的更多相关文章

  1. 基于go语言学习工厂模式

    工厂模式 简单工厂模式(Simple Factory) 定义 优点 缺点 适用范围 代码实现 工厂方法模式(Factory Method) 定义 优点 缺点 适用范围 代码实现 抽象工厂模式(Abst ...

  2. IOS设计模式浅析之简单工厂模式(SimpleFactory)

    概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...

  3. [javaSE] 看知乎学习工厂模式

    factory的“本质”就是根据不同的输入创建出不同类型的对象. 引入factory的原因就是你需要根据不同的输入创建不同类型的对象. 简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无 ...

  4. C++模式学习------工厂模式

    工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...

  5. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  6. 从BWM生产学习工厂模式

    工厂模式应用非常之广,在JDK底层源码以及各大主流框架中随处可见,一般以Factory结尾命名的类,比如Mybatis中的SqlSessionFactory,Spring中的BeanFactory等, ...

  7. iOS:个人浅谈工厂模式

    一.什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行.工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好 ...

  8. 设计模式学习——工厂模式(Factory Pattern)

    1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...

  9. 由XML解析学习工厂模式

    代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupData ...

随机推荐

  1. asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题

    最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception Sys ...

  2. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  3. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  4. 反编译.NET工程

    工具:       1.  .Net Reflector       2.   远程桌面 步骤: 1. 远程桌面连接到服务器 IP,port,user,pwd 2. 打开 IIS 这里面就是所部属的网 ...

  5. mako模板调试与使用技巧

    django默认的模板太不灵活,想把一个数字0.15显示成15%都得费不少劲,太不爽!!! 网上查阅了几个模板系统,有Jinja2等等,最后发现mako能够直接支持python的语句,最为灵活,果断选 ...

  6. IL指令详细表

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  7. 【Win 10应用开发】自定义浮动层——Flyout

    最近几天总是下雨,真是“何处秋窗无雨声”,也“不知风雨几时休”. 好,进入正题. 弹出层有三种. 第一种是ContentDialog,即内容对话框,它其实类似于模态对话框,弹出后会覆盖整个窗口区域,并 ...

  8. Matlab 利用参数方程绘制空心球体

    基本原理: 实质为利用球面参数方程,利用网格化数据绘制 x=R*sin(theta)*cos(phi) y=R*sin(theta)*sin(phi) z=R*cos(theta) 绘制函数: fun ...

  9. 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

  10. Vertica集群扩容实验过程记录

    需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...