《JAVA与模式》之工厂方法模式

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、工厂方法模式
  • 二、工厂方法模式的活动序列图
  • 三、工厂方法模式和简单工厂模式


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述
在阎宏博士的《JAVA与模式》一书中开头是这样描述工厂方法模式的:

工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

那么工厂方法模式是在什么场景下使用呢,下面就以本人的理解举例说明:

相信很多人都做过导入导出功能,就拿导出功能来说。有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式如:HTML、CSV、PDF等,每种格式导出的结构有所不同,比如:财务跟其他人对导出薪资的HTML格式要求可能会不一样,因为财务可能需要特定的格式方便核算或其他用途。

如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。

这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。

这种进一步抽象化的结果,使这种工厂方法模式可以用来允许系统在不修改具体工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。下面就针对以上需求设计UML图:


一、工厂方法模式

在这里插入图片描述
从上图可以看出,这个使用的工厂方法模式的系统涉及到以下角色:

抽象工厂(ExportFactory)角色:担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。

具体工厂(ExportHtmlFactory、ExportPdfFactory)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类(如:ExportStandardHtmlFile)。

抽象导出(ExportFile)角色:工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。

具体导出(ExportStandardHtmlFile等)角色:这个角色实现了抽象导出(ExportFile)角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出角色的实例。
  首先是抽象工厂角色源代码。它声明了一个工厂方法,要求所有的具体工厂角色都实现这个工厂方法。参数type表示导出的格式是哪一种结构,如:导出HTML格式有两种结构,一种是标准结构,一种是财务需要的结构。

![public interface ExportFactory {public ExportFile factory(String type);
}](https://img-blog.csdnimg.cn/direct/dcf94cc058a24f13b45b77800264d1f0.png)

具体工厂角色类源代码:

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

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

相关文章

【个人记录】CentOS7安装MySQL 5.7和libmysqlclient.so.20

记录 之前使用MariaDB 发现使用的libmysqlclient.so是18版本的,一些程序需要20版本的库,查了一下需要安装5.7以上版本的才有libmysqlclient.so.20,这里简单记录一下怎么安装。 安装MySQL 5.7 Yum源 yum install -y https://repo.mysql.com…

vuex怎么防止数据刷新丢失?

在Vue.js应用程序中,Vuex是一个用于管理应用程序状态的状态管理库。默认情况下,Vuex的状态存储在内存中,并且在页面刷新时会丢失。 为了防止数据刷新丢失,你可以考虑以下几种方法: 这些方法可以帮助你防止Vuex数据刷新…

浅析C++的指针与引用

浅析C的指针与引用 文章目录 浅析C的指针与引用一、对比引用与指针二、引用左值引用右值引用引用折叠 三、指针与引用的性能差距总结 一、对比引用与指针 总论: 引用指针必须初始化可以不初始化不能为空可以为空不能更换目标可以更换目标 引用必须初始化&#xff…

如何用SMU数字源表测试apd管的暗电流

01 APD工作原理 APD雪崩光电二极管的工作原理是基于光电效应和雪崩效应,当光子被吸收时,会产生电子空穴对,空穴向P区移动,电子向N区移动,由于电场的作用,电子与空穴相遇时会产生二次电子,形成雪…

串行通信——IIC总结

一.什么是IIC? IIC(Inter-Integrated Circuit)也称I2C,中文叫集成电路总线。是一个多主从的串行总线,由飞利浦公司发明的通讯总线,属于半双工同步传输类总线,仅由两条线就能完成多机通讯&#…

Android 辅助功能 -抢红包(二)

Android 辅助功能 -抢红包(二) 本篇文章继续讲述辅助功能实现抢红包的方案. 上篇文章主要讲了下辅助功能的基本使用,本文涉及的一些基础内容就不再赘述了. 有疑问的可以查看上篇文章: Android 辅助功能 -抢红包 1: 添加微信监听 修改xml文件,android:packageNames中新增微…

【解读】区块链和分布式记账技术标准体系建设指南

大家好,这里是苏泽。一个从业Java后端的区块链技术爱好者。 今天带大家来解读这份三部门印发的行业建设指南《区块链和分布式记账技术标准体系建设指南》 原文件可查看P020240112840724196854.pdf (www.gov.cn) 以下是个人解读,如有纰漏请指正&#xff…

Nginx 报错 504 Gateway Time-out 的解决方法

报错信息 504 Gateway Time-out 原因是程序执行时间过长,导致请求超时。 解决方法 首先,尽可能地优化程序代码的执行时间。 其次,修改配置文件。 修改 php.ini 配置文件。 max_execution_time 600 复制 修改 nginx.conf 配置文件。…

KY9 成绩排序

描述&#xff1a; 用一维数组存储学号和成绩&#xff0c;然后&#xff0c;按成绩排序输出。 输入描述&#xff1a; 输入第一行包括一个整数N(1<N<100)&#xff0c;代表学生的个数。 接下来的N行每行包括两个整数p和q&#xff0c;分别代表每个学生的学号和成绩。 输出描述…

【系统架构师】-第16章-嵌入式系统架构设计理论与实践

1、嵌入式系统发展 第一阶段&#xff1a;单片微型计算机 (SCM) 阶段&#xff0c;即单片机时代&#xff0c;五操作系统 第二阶段&#xff1a;微控制器 (MUC) 阶段&#xff0c;有简单操作系统 第三阶段&#xff1a;片上系统 (SoC)&#xff0c;兼容各种微处理器 第四阶段&…

常见滤波方式的区别的优势

一. 限幅滤波法 给定一个最大偏差X&#xff0c;如果本次值与上次差值小于X&#xff0c;则本次有效&#xff0c;否则无效&#xff0c;使用上次值代替。 #incldue <stdio.h>#define X 2 int lastvalue; //限幅滤波法 int filter(void) {int nowValue ;nowValue getValue…

软件测试 —— 测试用例设计报告

写出测试网站的测试用例&#xff0c;测试网站具体内容可看团购网站系统需求说明书1.2.doc 一、流程1&#xff1a;注册→登录 图1&#xff1a;注册->登录流程图 1、 使用场景设计法设计测试用例 1&#xff09; 找出基本流和备选流 基本流注册用户-成功登录系统备选流1注册…

Jenkins cron定时构建触发器

from&#xff1a; https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax 以下内容为根据Jenkins官方文档cron表达式部分翻译过来&#xff0c;使用机翻加个人理解补充内容&#xff0c;包括举例。 目录 介绍举例&#xff1a;设置方法方法一&#xff1a;方法二&#xf…

3.2_1 虚拟内存的基本概念

3.2_1 虚拟内存的基本概念 虚拟存储技术也是存储空间扩充的一种技术&#xff0c;它比交换、覆盖技术要更先进一些。 &#xff08;一&#xff09;传统存储管理方式的特征、缺点 对于这种传统的存储管理方案&#xff0c;很多暂时用不到的数据也会长期占用内存&#xff0c;导致内存…

R 语言patchwork包拼图间隙

在R语言中&#xff0c;patchwork包是一个非常强大的工具&#xff0c;允许你轻松地将多个图表拼接在一起。如果你希望调整拼图间的间隙&#xff08;即图表之间的空白区域&#xff09;&#xff0c;可以通过使用plot_layout()函数来实现&#xff0c;其中可以指定guides参数和spaci…

【数据结构和算法初阶(C语言)】栈的概念和实现(后进先出---后来者居上的神奇线性结构带来的惊喜体验)

目录 1.栈 1.1栈的概念及结构 2.栈的实现 3.栈结构对数据的处理方式 3.1对栈进行初始化 3.2 从栈顶添加元素 3.3 打印栈元素 3.4移除栈顶元素 3.5获取栈顶元素 3.6获取栈中的有效个数 3.7 判断链表是否为空 3.9 销毁栈空间 4.结语及整个源码 1.栈 1.1栈的概念及结构 栈&am…

Codeforces Round 933 (Div. 3)

比赛地址传送门 A. Rudolf and the Ticket 题目大意&#xff1a; 给定两个数组和一个 k&#xff0c;要求从两个数组中各选一个数求和不大于 k&#xff0c;有多少种方案 思路&#xff1a; 维护一个数组 f[i] 代表小于等于 i 的数字的数量&#xff0c;遍历另一个数组&#xff0…

遇到:java.lang.reflect.InaccessibleObjectException: Unable to make错误应该如何解决

遇到 "java.lang.reflect.InaccessibleObjectException: Unable to make" 错误是因为你的代码尝试访问了一个不可访问的对象或方法。这通常会发生在使用反射机制时&#xff0c;尝试访问私有或受限制的成员时。要解决这个问题&#xff0c;你可以考虑以下几个步骤&…

高压辊磨机(辊压机)在矿物加工领域应用广泛 目前本土企业处于向高端转型阶段

高压辊磨机&#xff08;辊压机&#xff09;在矿物加工领域应用广泛 目前本土企业处于向高端转型阶段 高压辊磨机又称为辊压机、挤压磨&#xff0c;是基于料层粉碎原理设计的一种干式辊磨设备。高压辊磨机结构形式多样&#xff0c;但原理基本相似&#xff0c;主要由机架、高压工…

浅谈C++绑定器bind1st、bind2nd和函数对象function

今天我们先来谈谈C 标准库里面的绑定器bind1st&#xff0c;bind2nd 和函数对象function C 绑定器和函数对象 一、绑定器二、函数对象 一、绑定器 虽然在C11标准中这两个绑定函数已经被弃用&#xff0c;但仍然值得我们深入思考其底层原理。从字面上理解&#xff0c;“绑定” 这…