工厂模式,也叫做说虚构造器,在简单工厂中间插入了一个具体产品工厂,这个工厂知道产品构造时候的具体细节,而简单工厂模式的产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面的。工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,工厂模式符合软件开发中的OCP原则(open close principle),对扩展开放,对修改关闭。

抽象工厂模式:这个模式我总是感觉和builder模式非常相似。
工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。

有人做如下的比较:
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

下面是一个形象的比喻:
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。拿一个生产水杯(cup)的工厂举例:起初,不用工厂模式,我必须在生产水杯之前知道水杯的材料和形状等水杯的所有特征才能生产,这就是我们的new Cup();这个Cup必须是具体的。厂主发现同一形状的被子,只是材料不同,如一个是玻璃(glass)的,一个是瓷(china)的,但是确要两条生产线,显然有资源浪费的嫌疑。现在厂主生产杯子时先不让生产线知道我要产的是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了。但是很可惜,java并不能new一个抽象的Cup,所以就有了简单工厂模式。原来是Cup cup=new Cup;现在是SimpleCupFactory.createCup(String cupName),根据cup的名字生产Cup,而createCup返回的是一个实现了 Cup接口或抽象类的具体Cup。简单抽象工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,工厂里并没有定义相应的处理流程,只能更改createCup方法,这就不合理了。我现在只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就行了吗,干嘛还要更改整条生产线呢?于是就有了工厂模式。原来生产线在生产模具的时候还要考虑是为玻璃杯生产的模具还是为铁杯生产的模具,现在它不用管了。CupFactory.createCup()创建Cup.CupFactory是接口或抽象类。实现它的具体子类会创建符合Cup接口的具体Cup。那么现在厂主想要生产水壶(kettle),用工厂模式就不得不再造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。在原CupFactory中加一个createKettle()方法,用来生产水壶。

转载于:https://www.cnblogs.com/duanxz/p/4964123.html

工厂模式,简单工厂模式,抽象工厂模式三者有什么区别相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. 抽象工厂模式_设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...

  3. 工厂模式三部曲之三_抽象工厂模式(附三部曲源码)

    抽象工厂模式是对工厂模式的进一步抽象,是工厂模式中最为抽象和最具一般性的一种形态,提供了创建一系列相关或者相互依赖对象的接口,而无需指定他们的类型. 如果你对工厂模式还有些迷惑的,可以回顾下工厂模式的 ...

  4. 【设计模式】11-15:迪米特拉(最小知识)原则、外观模式、建造者模式、观察者模式、抽象工厂模式...

    十一.迪米特拉原则/最小知识原则 如果两个类直接进行通信,那么这两个类就不能存在关系 调用其他类的方法时,需要第三个类实现转发-->外观类 尽量降低类的访问权限 十二.外观模式 隐藏系统的复杂性 ...

  5. 设计模式总结四(外观模式、建造者模式、观察者模式和抽象工厂模式)

    序 这么多天里,我已经读完了<大话设计模式>.放寒假了,没有了通过学业考试的重担,阅读技术书籍的时间页多出来了不少. 在今天我刚阅读了<kafka权威指南>的第一章,关于介绍k ...

  6. 抽象工厂模式_常用设计模式--抽象工厂模式

    抽象工厂模式 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 作用 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的 ...

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

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

  8. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  9. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  10. 设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?

    还记得之前的工厂方法模式么?现在老板更加富有了,除了水果,还准备搞点其他的生意,再做点服装生意.水果工厂和服装工厂明显就不是同一种东西,肯定不能放到一个工厂里面生产,服装也有好几种,但是不同的工厂,也 ...

最新文章

  1. 视频系列:RTX实时射线追踪(上)
  2. linux mysql 客户端编码设置_mac和linux下mysql字符集设置问题
  3. RUBY ON RAILS 插件收录: CACHE:Sweeper Generator
  4. 计算机学院运动会通讯稿,2021大学运动会通讯稿篇
  5. Redux 进阶 - react 全家桶学习笔记(二)
  6. 建立ssr服务器_如何从零打造一款轻量且天然支持SSR的个人博客系统?
  7. 从苹果店员到机器学习工程师,高中学历澳洲小哥的自学路
  8. 【干货】2021新消费品牌STEP增长方法论:品牌营销与生意增长Playbook.pdf(附下载链接)...
  9. Atitit 高性能架构之道 attilax著 艾龙 著 1. 应用服务与数据隔离 2 2. 负载均衡你问题 2 2.1. 用户的请求由谁来转发到到具体的应用服务器 2 2.2. 有什么转发的算法
  10. Linux内核编程02:Kbuild子系统
  11. 矩阵L2,1范数及矩阵L2,p范数的求导
  12. python中求和公式是什么函数_python中求和函数怎么用
  13. 文学类的论文真的不需要数据么?
  14. 【经验】面对感冒引起的发烧怎么办,总结一些有用的经验
  15. 三星苹果还能笑多久?联想挑战智能手机全球霸主
  16. 机械秒表的使用方法_浪琴 L683、L688自动上弦机械计时秒表设置方法
  17. 2022最新影视小程序源码+支持JSON/卡密系统
  18. 古典概率,条件概率,全概率
  19. 区块链:P2P技术是什么
  20. python判断正数和负数教案_最新正数和负数教案

热门文章

  1. Mac Pro m1 安装 brew/eclipse/visual stadio code/nodejs/git
  2. [机器学习-概念篇]彻底搞懂信息量,熵、相对熵、交叉熵
  3. [爬虫-python]爬取京东100页的图书(机器学习)的信息(价格,打折后价格,书名,作者,好评数,差评数,总评数)
  4. 安装libsvm工具包
  5. leetcode - 62. 不同路径
  6. 去哪儿-16-detail-banner
  7. 数值分析-泰勒公式及泰勒级数
  8. ASUS K401L安装Windows8.1注意事项
  9. String和QString之间的转化----可避免出现中文乱码的现象
  10. jquery指定节点设css,jquery 获取和设置节点属性 css样式