一、引言

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
模式的问题:如何轻松构建对象,而不必关心创建对象的细节和复杂过程。 
解决方案:建立一个工厂来创建对象。它为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽起来,提高灵活性。

二、分类

工厂模式可以分类三类:
(1)简单工厂模式 simple factory
(2)工厂方法模式:factory method
(3)抽象工厂模式:abstract factory

三、区别

(1)简单工厂模式:一个工厂类,可以获取多个产品类实例。
(2)工厂方法模式:
一个抽象产品类,可以派生多个具体产品类。
一个抽象工厂类,可以派生多个具体工厂类。
每个具体工厂类派生一种产品类。
(3)抽象工厂模式:
多个抽象产品类,可以派生多个具体产品类。
一个抽象工厂类,可以派生多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
工厂方法模式和抽象工厂模式的区别:
一个抽象产品类 VS 多个抽象产品类 ;
每个具体工厂派生产品类实例:一种 VS 多种

四、简单工厂模式(静态工厂模式)

组成:一个工厂、一个抽象产品、多个具体产品。工厂里面提供静态方法获取对象实例。
优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定 的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要在工厂类中增加相应的业务逻辑。违反开闭原则。

五、工厂方法模式:factory method

组成:一个抽象工厂,一个抽象产品,多个具体工厂、多个具体实例。
去掉了简单工厂模式中的静态方法。在工厂方法模式中,不再提供一个统一的工厂类创建所有的对象,而是针对不同的产品提供不同的工厂。与简单工厂模式相比:引入了抽象工厂角色。由具体的抽象工厂子类去创建对象。解决了简单工厂模式中工厂类职责太重的问题。当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。符合开闭原则。
缺点:当产品种类非常多时,会出现大量与之对于的工厂类,这不是我们希望的。

六、抽象工厂模式:abstract factory

在工厂方法模式中,具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品。有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象。如一个电器厂,它可以生产电视机、电冰箱等。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,而是负责创建一组产品族。为了理解抽象工厂模式,引入两个概念。
1、产品等级结构:即产品的继承结构。抽象电视机是父类,而具体的品牌海尔电视机、TCL电视机是其子类。
2、产品族:在抽象工厂模式中,它是指由同一个工厂生产的,位于不同产品等级中的一组产品。如海尔电器工厂生产海尔电视机、海尔冰箱。即一个工厂生产多个产品对象。
总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。 在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
参考:https://www.cnblogs.com/yumo1627129/p/7197524.html  《Java设计模式》

转载于:https://www.cnblogs.com/suiyilaile/p/10097640.html

创建型模式-工厂模式相关推荐

  1. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂--区分"变与不变" 先来说说构造器 在介绍工厂模式之前,为了辅助大家的理解,我想先在这儿给大家介绍 ...

  2. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...

  3. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  4. 【创建型】工厂模式(Factory Pattern)详解

    工厂模式分为简单工厂.工厂方法.抽象工厂模式. 这一篇说一下简单工厂.工厂方法: 简单工厂 :用来生产同一等级结构中的任意产品.(不支持拓展增加产品) 工厂方法 :用来生产同一等级结构中的固定产品.( ...

  5. (创建型)设计模式——工厂模式(factory)

    ps:在以下讲述工厂模式中,模仿的场景如下:我们需要生产Car,建立相对应的CarFactory.使用CarFactory工厂来生产Car,并且可以在生产过程中进行一些处理.类图和代码如下. 1.Mo ...

  6. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  7. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  8. 创建型设计模模式---原型模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  9. 创建型设计模模式---建造者模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  10. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

最新文章

  1. Android中实现为TextView添加多个可点击的文本
  2. 如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib
  3. vxWorks多任务编程初探-上
  4. spring aop实例讲解_Spring框架核心知识点
  5. 医疗知识图谱NLP项目,实体规模4.4万,实体关系规模30万
  6. 堆排序HeapSort
  7. itop4412的安卓驱动移植
  8. 16qam星座图 matlab,16qam星形和矩形星座图调制解调matlab代码.doc
  9. 《深度卷积神经网络原理与实践》笔记 第二、三章 卷积神经网络原理及典型结构
  10. 开源项目的版权声明已无存在必要?
  11. 网站SEO优化数据分析之跳出率+停留时间
  12. reference to ‘ max‘ is ambiguous
  13. 【转】宽带路由器应用(三)—ARP欺骗防护功能的使用
  14. 遗传算法之:八皇后问题
  15. 2012年度最佳分享:仿webQQ界面,详情请下载,不吃亏
  16. HTML和CSS内容总结
  17. python泊松分布_常见概率分布的Python实现
  18. install Understand on ubuntu 22.04
  19. C是C++的子集吗?
  20. MySQL事务与锁详解,并发读异常与隔离策略

热门文章

  1. Unet实现图像分割(三)
  2. mysql tomocat vs2005_C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装
  3. php数组选择随机元素,php 数组随机选择一个元素显示的简单示例
  4. dataframe 提取月数据_pandas dataframe数据提取的方法
  5. js中深拷贝和浅拷贝问题
  6. 四川网络推广浅析新站要如何更快的获得好排名?
  7. sub在python中的意义_在python中,如何使用回复sub?
  8. 趣谈网络协议笔记-二(第七,八,九讲)
  9. Android获取顶部状态栏statusBar高度、底部导航栏navigationBar高度
  10. 开发日记-20190916 gradle新的依赖方式implementation,api,compileOnly