首页 > 编程语言 >java设计模式,简单工厂和抽象工厂有什么区别?

java设计模式,简单工厂和抽象工厂有什么区别?

时间:2023-09-08 16:01:04浏览次数:34  
标签:java 角色 工厂 抽象 产品 具体 设计模式

java设计模式,简单工厂和抽象工厂有什么区别?

简单工厂模式:

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。

它由三种角色组成:

工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。

抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。

具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。

java设计模式,简单工厂和抽象工厂有什么区别?_java

来用类图来清晰的表示下的它们之间的关系:

抽象工厂模式:

先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。

java设计模式,简单工厂和抽象工厂有什么区别?_抽象工厂模式_02

图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。

可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

而且使用抽象工厂模式还要满足一下条件:

系统中有多个产品族,而系统一次只可能消费其中一族产品

同属于同一个产品族的产品以其使用。

来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。


标签:java,角色,工厂,抽象,产品,具体,设计模式
From: https://blog.51cto.com/u_16207997/7411312

相关文章

  • java开发之个微机器人的二次开发
    简要描述:修改我在某群的昵称请求URL:http://域名/updateIInChatRoomNickName请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标识请求参数示例{"wId":"4941c159-48dc-4271-b0d0-f94adea39127",......
  • java 支持 超大上G,多附件上传实例
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • java正则表达式(一)
    转: https://www.cnblogs.com/-w-k-/p/16040896.html一、校验数字的表达式1数字:^[0-9]*$2n位的数字:^\d{n}$3至少n位的数字:^\d{n,}$4m-n位的数字:^\d{m,n}$5零和非零开头的数字:^(0|[1-9][0-9]*)$6非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7带......
  • Python 框架(Flask,tornado,fastAPI)Go 的gin框架 Java spring 框架中的性能对比
    使用jmeter进行压测:配置如下: Flask框架:Python代码:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=='__main__':app.run(port=8080)测试结果: Tornado......
  • 无涯教程-JavaScript - IMCOSH函数
    描述IMCOSH函数以x+yi或x+yj文本格式返回复数的双曲余弦值。语法IMCOSH(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwantthehyperboliccosine.RequiredNotesExcel中的复数只是简单地以文本形式存储在Excel中。......
  • 设计模式-单例模式
    保证在整个软件系统中,对某个类只能存在一个对象实例。饿汉式(类加载时创建,没用到也创建)1、构造器私有化(防止new对象)。2、类内部创建私有的静态对象。3、用一个公共的getInstance()静态方法返回该对象。如Runtime类懒汉式(使用才创建)1、仍然使构造器私有化。2、类内部定义静......
  • Sermant类隔离架构:解决JavaAgent场景类冲突的实践
    本文分享自华为云社区《Sermant类隔离架构解析——解决JavaAgent场景类冲突的实践》,作者:华为云开源。 一、JavaAgent场景为什么要注意类冲突问题?类冲突问题并非仅存在于JavaAgent场景中,在Java场景中一直都存在,该问题通常会导致运行时触发NoClassDefFoundError、ClassNotFoundExcep......
  • Java并发篇:6个必备的Java并发面试种子题目
    线程创建和生命周期线程的创建和生命周期涉及到线程的产生、执行和结束过程。让我们继续深入探索这个主题:线程的创建方式有多种,你可以选择适合你场景的方式:继承Thread类:创建一个类,继承自Thread类,并重写run()方法。通过实例化这个类的对象,并调用start()方法,系统会自动调用run()方法......
  • 无涯教程-JavaScript - IMCOS函数
    描述IMCOS函数以x+yi或x+yj文本格式返回复数的余弦。语法IMCOS(inumber)争论Argument描述Required/OptionalInumberAComplexNumberforwhichyouwantthecosine.RequiredNotesExcel中的复数仅存储为文本。当将格式为"a+bi"或"a+bj"的文本字符......
  • 在MAC配置java环境,安装JDK和MAVEN
    一、JDK的安装与配置1、下载JDK,应为安装vs时,vs自动下载了openjd11,所以我这边进行配置就可以了,接下来配置 .bash_profile和.zshrc,不配置.zshrc重启后配置将不生效vim ~/.bash_profileexportJAVA_HOME=/Library/Java/JavaVirtualMachines/microsoft-11.jdk/Contents/Homee......