在Java的23中设计模式中,其中有创建型的一类创建模式,通常用来抽象封装创建对象来使用的,这一类创建模式是使得客户端调用者不用关心对象是如何创建,统统交给一个叫做“工厂”的对象来创建对应的对象。这样就能做到客户端不与想要创建的对象紧密地耦合,降低耦合度。

1.简单工厂

简单工厂具体来并不属于Java中的23种设计模式中之一,它只是一种对创建对象的简单的封装,只需要传入一个正确的参数,就可以得到获取你所需要的对象。简单工厂比较适合用于那些创建类比较少的场合,以及客户端只知道传入工厂类的参数即可,对于如何创建对象并不关心。

下面我们来看看简单工厂的实例:

我们这里的例子场景是我们此时需要开发一个在线学习的系统平台,里面可以学习Java,Python,算法,前端等等课程,对于每一个课程我们都要去录制相应的视频,每一个课程录制步骤都不一样,那么此时我们可以使用简单工厂去创建不同的课程对象来调用录制视频的方法。

首先我们要定义一个Video抽象类,来抽象出Video对象,每一个课程对象都继承与Video对象

创建不同的课程对象

创建一个简单工厂类,这个类负责不同的课程对象的创建,里面的create方法根据不同的参数进行对应对象的创建

客户端调用就可以直接创建简单工厂的实例,然后传入你想创建的对象的参数它就可以帮你创建你想要的对象。

Idea中UML类图:

简单工厂的总结:简单工厂封装了对象创建的过程,使得我们调用方不直接依赖与需要创建的对象,我们也不用关心该对象是怎么创建的,我们只需要告诉工厂类我们需要哪个对象,这样工厂类就能帮我们创建并且返回给我们了。但是简单工厂的缺点也显而易见,就是当我们需要创建的对象越来越多的时候,工厂类里面的create方法的if分支就会越来越多,这样会造成代码可读性越来越差,这样也违背了设计原则中的开闭原则,所以说简单工厂适用于创建对象比较少的场合。

2.工厂方法

工厂方法是属于Java的23中设计模式之一的。我们可以知道简单方法的缺点在于当我们需要创建的对象越来越多的时候,工厂类的职责会越来越重,那么我们是否可以相对于不同的产品等级分为不同的工厂方法来创建不同的对象尼?

我们可以把不同的课程视频对象分别对应于不同的工厂类创建,这样就不存在于与简单工厂中随着创建的对象的增多工厂类的职责越来越重,以及修改原本工厂类创建对象的逻辑代码了,也符合了开闭原则。比如这里我们要新增加一个前端的课程,那么利用工厂方法模式我们只需要新建一个前端课程视频的工厂类来负责前端课程视频对象的创建就行了。

创建一个工厂抽象类,里面的抽象方法就是用来创建视频对象的

创建不同课程视频的工厂对象

客户端调用,这样当我们想要创建Java的课程视频对象的时候尼我们只需要创建出Java课程视频的工厂对象就行了,而我们想要新增一个前端的课程的话,就继承VideoFactory对象创建出前端的课程视频工厂类,在这个工厂里面去创建前端课程视频对象。

Idea中的UML类图:

工厂方法的总结:使用工厂方法可以解决掉简单工厂随着需要创建的对象越来越多而导致不断修改工厂类中创建对象的逻辑,从而违背了开闭原则的问题。当我们的需求需要新增一个类的时候,我们可以不用去修改原有的代码,新增一个对应的工厂类负责这个新增的类的创建就行了,这样方便了在原有代码的基础上进行拓展,符合开闭原则的规定。

3.抽象工厂

抽象工厂和工厂方法其实很像,不过尼对于抽象工厂模式的工厂来说,每一个工厂负责的是每一个产品族的创建,什么是产品族,在说到产品族就会有一个产品等级的概念想对应,举个例子,电商系统我们在里面想要上架美的的空调,美的的冰箱,海尔的空调,海尔的冰箱,那么对于美的这个品牌来说,美的的空调,美的的冰箱就相当于一个产品族,都是属于美的的,同理,海尔的空调,海尔的冰箱也是一个产品族,都是属于海尔的。而美的的冰箱,海尔的冰箱就两者都同属于一个产品等级(都是冰箱)。所以产品族和产品等级是相对于不同角度去归类的,产品族里面都是不同类型的产品但同属于一个系列的集合,产品等级是不同系列中的同类型的集合。那么抽象工厂就是针对产品族而言去创建产品族对象的。

这时候我们的系统多了一个需求就是每一个课程都要有视频+笔记才能称得上是一个完整的课程,而我们此时每一个课程只有视频,所以我们就要创建一个课程笔记的类。

对应的工厂类就应该有课程的视频对象和课程的笔记对象,因为对于Java这个课程来说,Java的视频和Java的笔记就是一组产品族。

创建抽象工厂类

创建Java课程的产品族工厂类

客户端调用

抽象工厂UML类图:

抽象工厂的总结:抽象工厂是针对于产品族而言的,而工厂方法是针对于产品等级而言的,这是两者最大的区别。抽象工厂能将一个系列的产品族统一到一个工厂类去创建,使得具体产品族在应用层代码隔离,无须关心创建细节。但是抽象工厂的缺点也很明显的,就是当我们想对这个产品族进行产品扩展的时候,我们不得不去修改抽象工厂中的抽象方法,这样就违背了开闭原则,所以说并不是所有的设计模式都严格遵守于设计原则的。如果我们的需求不是经常变更的话,那么使用抽象工厂模式也是利大于弊的。

Java创建型设计模式之简单工厂,工厂方法,抽象工厂相关推荐

  1. Java创建型设计模式——建造者模式

    文章目录 1.0概念理解 2.0编码理解 2.1编码说明 2.2编码实现 五种创建型设计模式:工厂方法模式.抽象工厂模式.建造者模式.原型模式.单例模式 1.0概念理解 ​ ​ 一句话理解:建造者模式 ...

  2. java创建型_Java创建型模式

    Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...

  3. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

  4. 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)

    创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...

  5. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  6. 创建型设计模式之工厂模式

    文章目录 一.工厂设计模式 二.工厂设计模式详解 1.简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 总结 一.工厂设计模式 工厂模式就类比实际生活中的工厂,在实际生活中,用户从来不会关系一个物 ...

  7. android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式

    一.介绍,定义 抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现. 为创建一组相关或者相互依赖的对象提供接口,而不需要具体指定 ...

  8. 创建型设计模式——抽象工厂模式

    1.什么是抽象工厂模式? 抽象工厂模式:  定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 从设计层面看,抽 ...

  9. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  10. java设计模式(一)——五种创建型设计模式

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

最新文章

  1. Metasploit(一)--Meterpreter的命令速查表
  2. 贝叶斯神经网络计算核裂变碎片产额
  3. MySQL主从复制性能优化
  4. Java后端:10w行级别数据的Excel导入优化记录
  5. mysql 端口 telnet 不通_3306端口不通,不一定是网络的问题
  6. cmd如何默认以管理身份运行
  7. 笨办法学 Python · 续 练习 38:SQL 简介
  8. VB得到指定文件夹下的文件列表
  9. 分享30个网页设计色彩搭配的优秀案例
  10. win10 快速访问存在 2345Downloads 删除解决方案
  11. 双电容单相电机接线图解_拿走不谢!75例自动控制原理图、接线图
  12. 网络营销之百度营销技巧(一) 百度知道推广日常手册
  13. IE11的安装方法和更新补丁
  14. 几款Mac下载神器推荐,让你相见恨晚的MacBook神器
  15. 大量HW红队+蓝队文档下载-定期更新
  16. MathType公式编辑器的下载安装及导入Word
  17. 好长的一篇Android与iPhone的对比
  18. 60个英文阅读网站强力推荐
  19. Hibernate could not initialize proxy - the owning Session was closed 错误 :解决办法
  20. web 前端学习线路图

热门文章

  1. 翻译:swift 5通过使用泛型进行高级异步操作Operation
  2. git diff与git status
  3. 5G面临的挑战和应用场景
  4. 解决办法!!!!UnsatisfiedLinkError: Failed to find the required library mclmcrrt9_0.dll on java.library.
  5. 循环神经网络-Recurrent Neural Networks
  6. 最新回归算法理解、实现及应用(1)线性回归
  7. Frobenius companion matrix
  8. latex 常用学习/模板/公式输入网站合集
  9. 能力提升综合题单 Part 8.9.2 最小割
  10. 关于Redis启动时报权限不够(-bash: /usr/local/bin/redis-server: Permission denied)