1. 简单工厂模式

怎样理解简单工厂,工厂方法。 抽象工厂三种设计模式?

简单工厂的生活场景。卖早点的小摊贩。他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂。它生产包子,馒头,地沟油烙的煎饼。

该场景相应的UML图例如以下所看到的:

图1:简单工厂模式UML图

简单工厂模式的參与者:

工厂(Factory)角色:接受client的请求,通过请求负责创建对应的产品对象。

抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共有的接口。但是抽象类或接口。

详细产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。

简单工厂模式的演变:

所看到的。这样。工厂角色与详细产品能够合并。

简单工厂模式的优缺点:

1.)工厂类含有必要的创建何种产品的逻辑。这样client仅仅须要请求须要的产品,而不须要理会产品的实现细节。

2.)工厂类仅仅有一个,它集中了全部产品创建的逻辑。它将是整个系统的瓶颈,同一时候造成系统难以拓展。

3.)简单工厂模式通常使用静态工厂方法,这使得工厂类无法由子类继承,这使得工厂角色无法形成基于继承的等级结构。

2. 工厂方法模式

工厂方法使用OOP的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的接口。然后在详细的工厂中创建详细的产品。工厂方法的生活场景,联合利华要生产“夏士莲”和“清扬”两款洗发水,它会建一个生产“夏士莲”的工厂和一个生产“清扬”的工厂。

图2:工厂方法的UML图

工厂方法模式中的參与者:

抽象工厂角色:与应用程序无关,不论什么在模式中创建对象的工厂必须实现这个接口。

详细工厂角色:实现了抽象工厂接口的详细类。含有与引用密切相关的逻辑,而且受到应用程序的调用以创建产品对象。

抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共有的接口。

详细产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每一个详细产品对象都是某个详细产品角色的实例。

工厂方法的优缺点:

1.)减少了工厂类的内聚。满足了类之间的层次关系,又非常好的符合了面向对象设计中的单一职责原则。这样有利于程序的拓展。如图三所看到的:

图3:工厂方法的拓展UML图

总结:把“共性”提取出来,依据各自的“个性”建立各自的继承共性的实现

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经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)的更多相关文章

  1. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  2. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  3. headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式

    先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...

  4. FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

    具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...

  5. 工厂模式(Factory)和抽象工厂模式(Abstract Factory)

    一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.     ...

  6. 【java设计模式】【创建模式Creational Pattern】抽象工厂模式Abstract Factory Pattern

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW0AAABvCAIAAACo3AbKAAALvUlEQVR4nO1dUa7cOA7U/c+zwJxkf4

  7. Java设计模式之简单工厂、工厂方法和抽象工厂

    在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...

  8. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  9. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html   v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ...

  10. c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别

    很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...

随机推荐

  1. 字符串格式时间转Date格式

    /** * 字符串时间格式转 Date 格式 * @param strDate * @return */ public static Date getDateTimeByStringTime(Stri ...

  2. NodeJS学习笔记 (9)网络服务-https(ok)

    模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严峻的今天,网站采用HTTPS是个必然的趋势. 在nodejs中,提供了 https 这个模块来完成 HTTPS 相关功能.从官方文档来看 ...

  3. mysql 1067终极解决办法 亲测好使

       进入mysql data 目录 删除 ib_logfile0  ib_logfile1   ibdata1   这三个文件 重启mysql

  4. VUEJS开发规范

    VUEJS开发规范 基于组件化开发理解 组件命名规范 结构化规范 注释规范 编码规范 基于组件化开发理解 什么是组件? ``` 组件其实就是页面组成的一部分,好比是电脑中的每一个元件(如硬盘.键盘.鼠 ...

  5. 记录python之递归函数

    函数move(n,a,b,c)的定义是将n个圆盘从a借助b移动到c. def move(n,a,b,c): if n==1: print a,'-->',c move (n-1,a,c,b) p ...

  6. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  7. Python 入门学习 -----变量及基础类型(元组,列表,字典,集合)

    Python的变量和数据类型 1 .python的变量是不须要事先定义数据类型的.能够动态的改变 2. Python其中一切皆对象,变量也是一个对象,有自己的属性和方法 我们能够通过 来查看变量的类型 ...

  8. PHP使用数组实现队列(实际就是先进先出怎样实现)

    PHP的数组处理函数还能够将数组实现队列,堆栈是"先进后出". 在堆栈中,最后压入的数据(进栈),将会被最先弹出(出栈).而队列是先进先出.就如同银行的排号机 PHP中将数组当做一 ...

  9. _00020 妳那伊抹微笑_谁的异常最诡异第一期之 SqlServer RSA premaster secret error

    博文作者:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 博文标题:_00020 妳那伊抹微笑_谁的异常最诡异第一期之 SqlServer RSA premas ...

  10. Constructor call must be the first statement in a constructor

    super()和this ()不能共存.否则编译时会报异常. Constructorcall must be the first statement in a constructor 换句话说就是su ...