Java设计模式-02工厂模式

news2024/9/21 4:39:33

  1. 为什么需要工厂模式,其作用什么?
  2. 如何实现,代码演示+解析优缺点。

Q1:为什么需要工厂模式?工厂模式的作用(优点)是什么?

  1. 解耦。把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的方法,不需要管B的实例化或者不感知B如何实例化,创建的工作交给工厂类。
  2. 代码复用。如果创建对象B的过程需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。把创建对象B的代码放到工厂里统一管理。既减少重复代码,也方便以后对B的创建过程的修改和维护。
  3. 符合迪米特法则和单一职责,使用者只需要知道如何使用产品以及负责如何用产品,无须感知创建的逻辑。

Q2: 有哪些工厂模式?如何实现?

一般有三种。简单工厂模式,工厂方法模式,抽象工厂模式,后两者时GOF23种设计模式中的。

简单工厂模式

定义:创建任务简单,一个工厂干所有的活。

代码演示:

类图:

优点:逻辑简单。封装了创建逻辑,将创建和使用解耦。

缺点:维护成本高,需要不断修改工厂内部实现,不符合开闭原则。

工厂方法模式

定义:简单工厂升级版。对工厂开始动刀子。定义工厂接口,制定规则,但具体实现下沉到实现体去控制。

代码演示:

类图变动:

具体代码:

优点:相比简单工厂,利于扩展和维护。比如当新增一种车时,只需要对应创建具体产品类和负责生产新品种车的具体工厂即可。符合“开闭原则”,便于扩展。

缺点:具有一定的局限性,只能生产出一种产品(由接口内部方法决定),比如我要生成BMW牌子的某级别车就不直接支持。

抽象工厂模式

定义:主要用于解决“一类产品”的创建问题,比如各种牌子的B级车,C级车。可以从自底向上抽象归纳的角度考虑。底层有多种抽象后可以归为一类的东西,这里就是B级车,C级车。也可以是篮球,足球,然后工厂需要负责创建不同牌子的篮球,足球。也可以理解为抽象工厂的工厂接口比工厂方法的更多,功能更强大。

区别:

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

代码演示:

类图:

优点:

  1. 抽象工厂模式隔离了具体类的生成,将创建和使用解耦。利于扩展和维护。所有的具体工厂都实现了抽象工厂中定义的那些公共接口只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
  2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
  1. 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

------------------------------------------    最后     -------------------------------------------------------------------------

源码:公 众 号 搜“程序员一棵树” ,回复 “设计模式” 即可获取源码链接。

 


更多 视频 内容请
     1. B 站         搜索关注 “程序员一棵树”
     2. 抖 音        搜索关注 “程序员一棵树”
     3. 公 众 号   搜索关注 “程序员一棵树”
————————————————
版权声明:本文为CSDN博主「ying105525」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010867670/article/details/128942659

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装jdk8

目录标题一、下载地址(一)Linux下载(二)Win下载二、安装(一)Linux(二)Win三、卸载(一)Linux(二)Win一、下载地址 jdk8最新版 jdk8其他…

Tessent Mbist(5) 并行static Retention(静态保持)测试

本章描述当嵌入存储器被不同的memory BIST控制器所测试或者被不同的memory BIST controller steps按顺序进行测试时如何进行retention测试. 在跑PSRT(parallel static retention testing)之前,建议先跑BIST in HWDefault 或者 RunTimeProg 模式去保证有足够高的fault覆盖率;PSR…

iOS 奔溃EXC_BAD_ACCESS(KERN_INVALID_ADDRESS)分析

EXC_BAD_ACCESS (KERN_INVALID_ADDRESS)是一种常见的iOS应用程序崩溃错误,可能有以下原因: 尝试访问已释放的对象:即使是一个引用计数为0的对象,尝试访问它将导致崩溃。 尝试访问不正确的内存地址:例如,尝…

SpringBoot+Vue实现养老智慧服务平台

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…

高姿态下的面部表情识别系统

效果展示: python表情、性别识别面部表情识别 (FER) 在计算机安全、神经科学、心理学和工程学方面有大量应用。由于其非侵入性,它被认为是打击犯罪的有用技术。然而,FER 面临着几个挑战,其中最严重的是它在严重的头部姿势下的预测…

浅谈二维数组元素的地址

一维数组元素的地址大家都比较容易理解,但对于二维数组,就很容易搞混了.今天我又被这个问题给弄糊涂了,翻了翻老谭的书本,对这个问题有了更深的认识. 首先给出一个二维数组a,它的定义为: int a[3][4] {{1,3,5,7}, {9,…

同花顺2023届春招内推

同花顺2023届春招开始啦! 同花顺是国内首家上市的互联网金融信息服务平台,如果你对互联网金融感兴趣,如果你有志向在人工智能方向发挥所长,如果你也是一个激情澎湃的小伙伴,欢迎加入我们!岗位类别&#xf…

企业级信息系统开发学习笔记1.1 初探Spring——采用Spring配置文件管理Bean

文章目录零、本讲学习目标一、Web开发技术二、Spring框架(一)Spring官网(二)Spring框架优点(三)为什么要选择Spring?(四) Spring框架因何而来(五)…

寒假学习内容总结

1.html看视频过了一遍,没什么要学的。 2.CSS系统学习完了 全程做了详细的笔记 并复刻了几个网页页面 规范了自己的css代码书写方式 http://t.csdn.cn/VxOih css引入方式,字体, 文本水平对齐方式,选择器,快捷语法&…

解决Idea启动项目失败,提示Error running ‘XXXApplication‘: Command line is too long

IDEA版本为:IntelliJ IDEA 2018.2 (Ultimate Edition)一、问题描述有时当我们使用IDEA,Run/Debug一个SpringBoot项目时,可能会启动失败,并提示以下错误。Error running XXXApplication: Command line is too long. Shorten comman…

Transformer简介

Transformer: 总体架构 Transformer是“编码器—解码器”架构,由编码器(encoder)和解码器(decoder)组成,其都是多头自注意力模块的叠加。其中,input sequence分成两部分,分别为源(input)输入序列和目标(output)输出序列。前者输入…

包管理工具-npm-npx-yarn-cnpm

代码共享方案 在我们通过模块化的方式将代码划分成一个个小的结构后,在以后的开发中我们就可以通过模块化的方式来封装自己的代码,并且封装成一个工具,这个工具我们可以让同事通过导入的方式来使用,甚至你可以分享给世界各地的程…

数字货币的路在哪里?

在人工智能、分布式数据、边缘计算等核心技术不断发展和普及的过程中,Web3 以其对传统互联网的惊人重塑展现出无穷的发展潜力。在最初的构想中,数字货币是方便用户在 Web3 世界自由交互的通行证。但随着加密货币市场刚刚从长期的动荡中缓慢复苏&#xff…

4个月的测试经验,来面试就开口要17K,面试完,我连5K都不想给他.....

2021年8月份我入职了深圳某家创业公司,刚入职还是很兴奋的,到公司一看我傻了,公司除了我一个测试,公司的开发人员就只有3个前端2个后端还有2个UI,在粗略了解公司的业务后才发现是一个从零开始的项目,目前啥…

系统应用 odex 转 dex

说下为什会有这个需求,以某系统应用为例,我们通过 adb 获取到的 apk 反编译查看只有少部分代码和资源,关键代码看不到。 经过一系列操作,把 odex 转换为 dex 可以看到源码。 工具下载 Smali 下载 1、使用 adb shell pm list pa…

SpringBoot框架SpEL表达式注入漏洞复现与原理分析

前言 这是2016年的一个洞,利用条件是至少知道一个触发 springboot 默认错误页面的接口及参数名。 影响版本:1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升级版本 环境搭建 下载链接:https://github.com/LandGrey/SpringBootVu…

asyncexcel按类型分sheet导出相同数据

需求背景 看标题又是一个变态的需求,但是实际业务场景中确实存在。 既然有需求那我们就得支持。 那么这种场景下如何使用asyncexcel进行异步导出呢? 在之前的文章中我们已经实现了分sheet导出不同业务的数据了 那么此时的场景似乎也差不多&#xff0c…

Python open()函数详解:打开指定文件

在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。open() 函数用于创建或打开指定文件,该函数的常用语法格式如下:file ope…

git日常使用命令

实习这段时间使用了很多git指令来提交代码,简单记录一下日常使用的指令: 提交代码通常顺序: 1.git status 查看本地修改项 2.git add . 提交全部文件 (这个 .是全部文件)到暂存区 3.git commit -m ‘本次提交的说明’…

HTTPS基础原理和配置 - 1

近期又碰到了SSL相关的事情, 就心血来潮开个新专题 - 《HTTPS基础原理和配置》 本文是第一篇文章, 主要介绍SSL TLS加密协议的相关内容。 加密协议历史概要 SSL TLS加密协议其实并没有很长的历史,1995年网景发布了SSL v2.0,这也是web加密的开…