iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式
怎样理解简单工厂,工厂方法。 抽象工厂三种设计模式?
简单工厂的生活场景。卖早点的小摊贩。他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂。它生产包子,馒头,地沟油烙的煎饼。
该场景相应的UML图例如以下所看到的:
图1:简单工厂模式UML图
简单工厂模式的參与者:
工厂(Factory)角色:接受client的请求,通过请求负责创建对应的产品对象。
抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共有的接口。但是抽象类或接口。
详细产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。
简单工厂模式的演变:
所看到的。这样。工厂角色与详细产品能够合并。
简单工厂模式的优缺点:
1.)工厂类含有必要的创建何种产品的逻辑。这样client仅仅须要请求须要的产品,而不须要理会产品的实现细节。
2.)工厂类仅仅有一个,它集中了全部产品创建的逻辑。它将是整个系统的瓶颈,同一时候造成系统难以拓展。
3.)简单工厂模式通常使用静态工厂方法,这使得工厂类无法由子类继承,这使得工厂角色无法形成基于继承的等级结构。
2. 工厂方法模式
工厂方法使用OOP的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的接口。然后在详细的工厂中创建详细的产品。工厂方法的生活场景,联合利华要生产“夏士莲”和“清扬”两款洗发水,它会建一个生产“夏士莲”的工厂和一个生产“清扬”的工厂。
图2:工厂方法的UML图
工厂方法模式中的參与者:
抽象工厂角色:与应用程序无关,不论什么在模式中创建对象的工厂必须实现这个接口。
详细工厂角色:实现了抽象工厂接口的详细类。含有与引用密切相关的逻辑,而且受到应用程序的调用以创建产品对象。
抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共有的接口。
详细产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每一个详细产品对象都是某个详细产品角色的实例。
工厂方法的优缺点:
1.)减少了工厂类的内聚。满足了类之间的层次关系,又非常好的符合了面向对象设计中的单一职责原则。这样有利于程序的拓展。如图三所看到的:
总结:把“共性”提取出来,依据各自的“个性”建立各自的继承共性的实现
3. 抽象工厂设计模式
所谓抽象工厂是指一个工厂等级结构能够创建出分属于不同产品等级结构的一个产品族中的全部对象。以创建Unix控件和Windows控件为例说明。我们须要一个抽象工厂以下有两个子工厂,一个叫做UnixFactory,用于生产Unix族控件,一个叫做WinFactory,用于生产Win族控件。抽象工厂与工厂方法的差别是,工厂方法中的详细工厂一般仅仅生产一个或几个控件对象,而抽象工厂中的详细工厂生产的是一族控件对象。
如图4所看到的。
图4:抽象工厂设计模式UML图
抽象工厂中的參与者:
抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
详细工厂(Concrete Factory)角色:这个角色直接在client的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共有的接口。
详细产品(Concrete Product)角色:抽象工厂模式所创建的不论什么产品对象都是某一个详细产品类的实例。
这是client终于须要的东西。其内部一定充满了应用系统的商业逻辑。
抽象工厂的使用场景:
- 一个系统不应当依赖于产品类实例怎样被创建、组合和表达的细节,这对于全部形态的工厂模式都是重要的。
- 这个系统有多于一个的产品族,而系统仅仅消费当中某一产品族。
- 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,全部的产品以相同的接口出现。从而使client不依赖于实现。
抽象工厂模式与工厂方法模式的差别
工厂方法模式:每一个抽象产品派生多个详细产品类,每一个抽象工厂类派生多个详细工厂类,每一个详细工厂类负责一个详细产品的实例创建;
抽象工厂模式:每一个抽象产品派生多个详细产品类。每一个抽象工厂派生多个详细工厂类,每一个详细工厂负责多个(一系列)详细产品的实例创建。
//在UIKit框架下,我们用工厂方法和抽象工厂两种设计模式分别实现了两份Demo, 不理解两种设计模式该怎样实现的朋友能够到这里下载:
抽象工厂: http://download.csdn.net/detail/luozhonglan/8008001
工厂方法: http://download.csdn.net/detail/luozhonglan/8007973
參考文章:
简单工厂: http://blog.csdn.net/z251257144/article/details/7476849
工厂方法:http://blog.csdn.net/z251257144/article/details/7479183
抽象工厂:http://blog.csdn.net/z251257144/article/details/7482810
iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)的更多相关文章
- 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...
- FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式
具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...
- 工厂模式(Factory)和抽象工厂模式(Abstract Factory)
一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者. ...
- 【java设计模式】【创建模式Creational Pattern】抽象工厂模式Abstract Factory Pattern
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW0AAABvCAIAAACo3AbKAAALvUlEQVR4nO1dUa7cOA7U/c+zwJxkf4
- Java设计模式之简单工厂、工厂方法和抽象工厂
在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ...
- c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别
很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...
随机推荐
- PHP中使用DOM读取解析XML属性值一例
先看XML文件结构,与常见的文件略有不同,数据并不是用闭合标签保存的,而是直接保存在属性值中. <?xml version="1.0" encoding="utf- ...
- WebSocket 前端封装
$.extend({ socketWeb:function (opt) { if("WebSocket" in window){ var setting=$.extend({ ur ...
- 洛谷 P1417 烹调方案 (01背包拓展)
一看到这道题就是01背包 但是我注意到价值和当前的时间有关. 没有想太多,直接写,0分 然后发现输入方式不对-- 改了之后只有25分 我知道wa是因为时间会影响价值,但不知道怎么做. 后来看了题解,发 ...
- openssh 升级到7.5p1
1. 参照: http://www.cnblogs.com/xiegj/p/5669800.html http://blog.csdn.net/u011080082/article/details/5 ...
- COGS——T 826. [Tyvj Feb11] GF打dota
http://www.cogs.pro/cogs/problem/problem.php?pid=826 ★★☆ 输入文件:dota.in 输出文件:dota.out 简单对比时间限制:1 ...
- java 自定义实现base64编码转换
1.base64编码转换 所谓base64编码,即按照规则把字符转化为"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456 ...
- pydev 安装
pydev断断续续空余时间安装了好几天,终于安装上了,需要注意的几点有, 1.插件地址 http://update-production-pydev.s3.amazonaws.com/pydev/up ...
- ,典型递归问题-F(1025)mod 5 的值
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- 在PyCharm中以root权限运行和调试python代码
python中有的代码可能需要su权限,如 import os os.mkdir('/media/xxx/disk_a') 如果在交互式环境中使用,需要以sudo的方式启动python.而在PyCha ...
- 怎样解除内容审查程序的password
如题:怎样解除内容审查程序的password 在不知道password的情况下.通过改动注冊表解决.点击"開始"→"执行",输入"regedit&qu ...