原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow


感谢

感谢《Pro Objective-C Design Pattern for iOS》一书,这个博客系列由很多灵感源自次书。同时,也感谢Wiki以及一些博客博主。每篇文章最后,都会列出参考链接。

设计模式是为了解决一类问题而出现的,要深刻理解某个模式的应用场景,优点,缺点。千万不要为了使用而实用,那样很可能写出不伦不类的东西。

对于同一种模式,每个人的理解都不同,能解决实际问题才是关键


什么是工厂模式?

工厂是用来生产产品的。在iOS开发中,产品就是类的对象,工厂就是工厂方法。
工厂模式就是定义创建对象的接口,让子类决定实例化哪一个类。这样,类的实例化就推迟到了子类

先看看工厂模式提供的接口,也就是客户端(API使用者)调用的接口

  let factory:Factory = ...//获取工厂对象let product:Product = factory.createProduct()//这里获得到的可能是Product,也可能是Product的子类

可以看到,客户端只需要关注Factory和Product两个类即可,而不需要关注他的子类到底是啥


解决什么问题?

类有一组子类,可以共用一套接口,但是实例化的方式略有差异。用工厂的方式实现,使得客户端(类的调用着)能够专注于接口。而不需要访问具体的实现类。


什么时候使用工厂模式?

  • 编译器无法定义创建对象类
  • 类可以让其子类决定在运行期具体实例化的对象

实现原理

  • 接口定义:工厂类的接口定义可以是类,也可以是协议。
  • 工厂方法定义:

工厂模式的UML图

  • 注意其中红线圈住的部分,那是实际的客户端(API调用着)接触的部分,也就是你设计的接口。在面向对象编程里有个关键的概念:面向接口编程,而不是面向实现编程

对于,客户端来说,只需要接触工厂基类或者协议,得到产品基类就行了。

  • 比如,有一个鞋厂,它告诉我,跟他的代表人(工厂方法)说生产鞋子就行了,今天来的是跑鞋厂的代表,我跟他说生产鞋子,他就给我一双跑鞋。这样,我只需要专注一点:跟我要接触的代表人(工厂方法)说生产鞋子(统一接口),我就能够拿到对应的产品(实例)而我只关心鞋子的通用属性,不关心具体属性。


一个简单例子

Swift的例子采用协议作为抽象基础类,用一个方法来返回不同的对象。

//产品
protocol Shoes{func logDescription();
}
class RunningShoes:Shoes{func logDescription() {NSLog("跑鞋")}
}
class Sneakers:Shoes{func logDescription() {NSLog("板鞋")}
}
//工厂
protocol Factory{func createShoes()->Shoes;
}
class RunningShoesFactory:Factory{func createShoes() -> Shoes {return RunningShoes()}
}
class SneakerFactory:Factory{func createShoes() -> Shoes {return Sneakers()}
}
//模拟Runtime的不确定性
class SimulateDynamicFactory{class func simulateFactory()->Factory{let randomInt = random()%2if randomInt == 0{return RunningShoesFactory()}else{return SneakerFactory()}}
}

然后,看看客户端代码

let factory:Factory = SimulateDynamicFactory.simulateFactory()
let product = factory.createShoes()
product.logDescription()

可能有同学问了,我为何不直接访问shoes的对象,直接调用构造方法(),岂不是更简单直接。面向对象开发还有一个原则对扩展开发,对修改封闭。如果直接使用if else 进行Shoes(),那么当有一种新的鞋子出现的时候,客户端将不得不修改大量代码来支持新的鞋子。而使用工厂模式,由于接口始终是一直的,客户端几乎不需要修改什么代码。只需要扩展一类产品,增加一个Factory就可以了。

举个例子,假如我对上文的例子进行扩展,增加一类新的鞋子叫做leoShoes,我需要增加的代码是这样的


class LeoShoes:Shoes{func logDescription() {NSLog("扩展鞋子")}
}
class LeoShoesFactory:Factory{func createShoes() -> Shoes {return LeoShoes()}
}

然后,修改SimulateDynamicFactory.simulateFactory方法,看到了吧,客户端代码不用任何修改,假如你是在一个Team负责给别的人开发库,那么库的使用者肯定会谢谢你,否则你每发布一个版本,他都要修改调用


参考链接

  • WIKI Factory Design Pattern

下一篇

  • 抽象工厂模式

iOS 21种设计模式之工厂模式相关推荐

  1. Java23种设计模式之工厂模式

    工厂模式 前言 一.简单工厂模式 二.工厂方法模式 优点: 缺点: 三.工厂方法模式适合应用场景 总结 前言 核心本质: 1.实例化对象不使用new,用工厂方法代替, 2.将选择实现类,创建对象统一管 ...

  2. 23种设计模式-抽象工厂模式《三国王者》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体 ...

  3. 23种设计模式-抽象工厂模式介绍加实战代码

    1.描述 通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品. 工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂,而抽 ...

  4. 23种设计模式之工厂模式学习笔记

    什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...

  5. 23种设计模式——抽象工厂模式

    目录 抽象工厂模式(AbstractFactory) 产品族 理解 UML图 优缺点 应用场景 抽象工厂模式VS和工厂模式 实例 数据访问(工厂方法) 数据访问(抽象工厂) 用简单工厂改造抽象工厂 C ...

  6. 一天一种设计模式之六-----工厂方法模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式. 工厂方法模式定义:定义一个用于创建对象的借口,让子类决定实例化哪一个类.工厂方 ...

  7. 设计模式—简单工厂模式

    前言 简单工厂模式是一种比较容易理解的设计模式 简单工厂模式介绍 在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,当使用new 关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们间的 ...

  8. iOS常见的设计模式:工厂设计模式

    iOS常见的设计模式:工厂设计模式 简单工厂模式: 简单工厂模式(Simple Factory Pattern):专门定义一个类(工厂类)来负责创建其他类的实例.可以根据创建方法的参数来返回不同类的实 ...

  9. 程序员必备的21种“设计模式之道”!

    设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式的目的就是为了重用代码.让代码更容易被他人理解.保证代码可靠性.欢迎小伙伴们收藏关注,持续分享更多优质干货! ...

最新文章

  1. 【组队学习】【33期】动手学数据分析
  2. 几种filter的比较
  3. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...
  4. python中的doc_在windows 10上读取python中的.doc文件
  5. 1-jdk的安装与配置
  6. php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问
  7. linux监控电脑配置,Zabbix基本配置及监控主机
  8. Java与Python的区别告诉你,学什么看自己
  9. PHP三年15K,程序员月薪15K相亲三年才成功,被拒理由:这个薪资提鞋都嫌弃
  10. 2怎么升级固件_西门子PLC固件升级,S71200 固件升级方法
  11. 炼数成金数据分析课程---17、机器学习聚类算法(后面要重点看)
  12. 挑战练习14.8 删除crime 记录
  13. Atitit.软件GUI按钮与仪表盘(01)--js区-----js格式化的使用
  14. 《ISO20000-12011 认证合格判定基础》(证书样例子+认证文档+录音下载)
  15. Excel2016保存文件闪退(在安装了Visio后)
  16. java图书馆借书问题_图书馆借书系统-Java异常的学习和处理
  17. Webpower揭晓2017最有效数字营销策略
  18. IC基础知识7-数据选择器
  19. HTML-CSS常用元素居中对齐方法
  20. 【Dart语言第1篇】基础学习

热门文章

  1. 锤子手机T1发布:售价3000元起 7月初上市
  2. win32,win64编程永恒;语言编程需要注意的64位
  3. ssm+java计算机毕业设计英雄联盟俱乐部管理系统j4oh6(程序+lw+源码+远程部署)
  4. HTML基础,大三老学姐在线总结
  5. ubuntu 18.04 下安装微信
  6. Mac一直要求输入密码怎么办?Mac一直弹输入密码窗口或提示存储钥匙串解决方法
  7. 切边压力机行业调研报告 - 市场现状分析与发展前景预测
  8. If this is an unexpected issue and persists you can inspect it running `pod repo update --verbose`
  9. Spark中Map和Json字符串相互转换
  10. 支付宝 AR 红包技术探讨及如何在下一波技术浪潮中畅泳