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

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

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

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

我以一个简单的计算器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控件。抽象工厂和工厂方法的区别在于抽象工厂是需要创建一个或多个对象类的时候被使用,而工厂方法则是创建一个具体实例的时候被使用。

 

 

转载于:https://www.cnblogs.com/daxionglovecoding/p/5311348.html

IOS之Objective-C学习 工厂模式相关推荐

  1. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  2. iOS 21种设计模式之工厂模式

    原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow 感谢 感谢<Pro Objective-C ...

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

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

  4. 设计模式学习 - 工厂模式

    工厂模式: 定义了一个创建对象的接口,但由它的子类决定实例化哪一个对象.工厂方法将对象的实例化延迟到了子类. 模式组成: 一组使用者:父类定义一个创建对象的接口及其他通用接口,子类负责创建对象接口的具 ...

  5. 设计模式学习--工厂模式

    1.概述 工厂模式根据提供给他的数据,返回一个可能类中的一个类的实例. 2.示例  1using System;  2using System.Collections.Generic;  3using ...

  6. 设计模式学习-工厂模式

    工厂模式 工厂方法模式通过选取相关的实现类来满足调用组件的请求,调用组件无需了解这些实现. 何时使用 调用组件需要根据不同情况调用多个类的时候可以考虑使用工厂 下面是示例代码 ///用基类实现更合适. ...

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

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

  8. C++设计模式 | Factory工厂模式(简单工厂、工厂方法、抽象工厂)

    目录 简单工厂 工厂方法 抽象工厂 学习工厂模式需要有C++虚函数 纯虚函数等相关继承与多态知识 简单工厂 在简单工厂模式中,可以根据参数的不同返回不同的实例..简单工厂模式专门定义一个类来负责创建其 ...

  9. java 工厂模式实现_Java三种实现工厂模式的方法

    学习工厂模式的时候就曾思考过这么写的好处,再手动敲了代码后发现自己更糊涂了,后来搜索例子和各种文案才有点概念,特此记录一下个人的理解 工厂模式的好处: 1.减少了重复代码 2.让创建对象于使用方法分离 ...

  10. 设计模式之策略模式+工厂模式+模板模式结合

    设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...

最新文章

  1. Python正在吞噬世界
  2. Linux系统基础知识整理
  3. Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...
  4. 特征工程-统计数据特征
  5. 机器学习之生成学习算法
  6. GraphPad Prism绘制时间轴图
  7. The world at your fingertips — 天涯明月刀幕后23(海战)
  8. 机器学习算法中的概率方法
  9. python解释器环境中、用于表示上一次_文学人类学概说_尔雅文学人类学概说答案第四小节课后作业答案...
  10. 红黑树概念及其相关操作的实现
  11. struts2随笔(一)Action、struts.xml、Interceptor细节
  12. 太原工业学院单片机课程设计_单片机智能小车毕业设计论文
  13. innobackupex参数之 --throttle 限速这个值设置多少合理 原创
  14. 崩坏3支持鸿蒙系统没,崩坏3鸿蒙版
  15. php 去掉无关数据,php 读取 mysql 表中的double数据,去掉多余的0
  16. 查询服务器系统类型有哪些,查看服务器的操作系统类型
  17. Guava学习笔记(零):Google Guava 类库简介
  18. 【转】每天一个linux命令(11):nl命令
  19. android Rect
  20. 基于知识图谱的智能问答机器人技术架构

热门文章

  1. 【Java程序设计】图形用户界面(一)
  2. sqark sql练习之统计UV
  3. Windows核心编程笔记
  4. MySQL实验: 实践索引对全列匹配、最左前缀匹配、范围查询等条件的影响以及了解脏读、幻读等...
  5. 1019 数字黑洞 (20)
  6. DVWA系列之10 命令执行漏洞的挖掘与防御
  7. 通过Windows组策略限制证书组织流氓软件的安装运行
  8. python习题练习(chapater 5 -- python核心编程)
  9. C++中#和##的特殊使用
  10. 火车票放票时间 潜规则