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 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...
随机推荐
- 使用vuex的流程随笔
1.在建好的vue项目中新建一个vuex文件夹在此文件夹下建一个index.js文件,在此文件下引入vuex 模块(当然需要先npm下载)和vue模块,在引入你所有的自定义的module.js模块(下 ...
- Java基础学习总结(3)——抽象类
一.抽象类介绍 下面通过一下的小程序深入理解抽象类 因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:pub ...
- df -h 挂死
df -h 卡死的情况,那是因为无法统计挂载的目录的大小 一般是因为还挂载了一些外部的目录,如nfs的目录 可以用mount | column -t 命令查看哪些目录 然后umount这些目录, 一般 ...
- Qt之表单布局(QFormLayout)
简述 QFormLayout管理输入型控件和关联的标签组成的那些Form表单. QFormLayout是一个方便的布局类,其中的控件以两列的形式被布局在表单中.左列包括标签,右列包含输入控件,例如:Q ...
- UVA 11020 Efficient Solutions+multiset的应用
题目链接:点击进入 首先来讲,非常easy看到我们事实上仅仅要维护优势人群的集合:假设增加一个新的人,我们首先看一下优势人群中是否有人会让这个人失去优势,假设没有,则将这个人插入集合中.但要注意到这个 ...
- 精品JS代码收藏大全
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...
- 使用sh运行bash脚本的奇怪问题
在同一个文件夹下有两个脚本.a.sh和b.sh,脚本内容例如以下: a.sh: echo "test for a" source b.sh b.sh: echo "tes ...
- Maven集成jetty插件
本机环境 JDK 7 Maven 3.2 Jetty 8.1.9 Eclipse Luna pom.xml 配置 在你的 pom.xml 文件里加入 jetty 插件的描写叙述信息(查看Jetty很多 ...
- litepal更好的操作sqlite3,配置与基本操作
litepal更好的操作sqlite3 配置 在app下的build.gradle中加入 创建litepal.xml配置 在app/src/main下面创建assets,新建litepal.xml & ...
- 2.IntelliJ IDEA 2017创建JavaEE项目
转自:https://blog.csdn.net/qq_31628285/article/details/75139909?utm_source=blogxgwz0 IntelliJ IDEA 201 ...