设计模式(十) - 工厂方式模式
前言
在此前的设计模式(四)简单工厂模式中我们介绍了简单工厂模式,在这篇文章中我们来介绍下工厂方法模式,它同样是创建型设计模式,而且又有些类似,文章的末尾会介绍他们之间的不同。
1.工厂方法模式简介
工厂方法模式定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式UML图
找了下网上的UML图,都画的丑丑的,自己画吧,结果就出来这么一个更丑的UML图:

- Product:抽象产品类。
- ConcreteProduct:具体产品类,实现Product接口。
- Factory:抽象工厂类,该方法返回一个Product类型的对象。
- ConcreteFactory:具体工厂类,返回ConcreteProduct实例。
2.工厂方法模式简单实现
参考设计模式(四)简单工厂模式这篇文章,我接着举电脑生产的例子。
创建抽象产品
电脑产品类,它有一个start方法用于启动电脑:
public abstract class Computer{public abstract void start();
}
创建具体产品
具体的电脑产品分别是联想、惠普和华硕电脑:
public class LenovoComputer extends Computer {@Overridepublic void start() {System.out.println("联想电脑启动");}
}
public class HpComputer extends Computer {@Overridepublic void start() {System.out.println("惠普电脑启动");}
}
public class AsusComputer extends Computer{@Overridepublic void start() {System.out.println("华硕电脑启动");}
}
创建抽象工厂
里面有一个createComputer方法,想生产哪个品牌的电脑就生产那个:
public abstract class ComputerFactory {public abstract <T extends Computer> T createComputer(Class<T> clz);
}
具体工厂
广达代工厂是一个具体的工厂,他继承抽象工厂,通过反射来生产不同厂家的电脑:
/*** 广达代工厂*/
public class GDComputerFactor extends ComputerFactory {@Overridepublic <T extends Computer> T createComputer(Class<T> clz) {Computer computer=null;String classname=clz.getName();try {//通过反射来生产不同厂家的电脑computer= (Computer) Class.forName(classname).newInstance();} catch (Exception e) {e.printStackTrace();}return (T) computer;}
}
客户端调用
public class Client {public static void main(String[]args) {ComputerFactory computerFactory = new GDComputerFactor();LenovoComputer mLenovoComputer=computerFactory.createComputer(LenovoComputer.class);mLenovoComputer.start();HpComputer mHpComputer=computerFactory.createComputer(HpComputer.class);mHpComputer.start();AsusComputer mAsusComputerr=computerFactory.createComputer(AsusComputer.class);mAsusComputerr.start();}
}
结构很简单,看看下面的UML图就更加容易理解了:

3.工厂方法与简单工厂
简单工厂模式我们都知道,在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类,对客户端来说,去除了与具体产品的依赖,与此同时也会带来一个问题:如果我们去增加产品,比如我们要生产苹果电脑,那我们就需要在工厂类中在添加一个Case分支条件,这违背了开放封闭原则,我们对修改也开放了,不理解开放封闭的原则的同学可以查看设计模式(一)设计六大原则 这篇文章。而工厂方法模式就没有违背这个开放封闭原则,如果我们需要生产苹果电脑,并不需要去修改工厂类,直接创建产品就好了。
相关文章:
设计模式(十) - 工厂方式模式
前言 在此前的设计模式(四)简单工厂模式中我们介绍了简单工厂模式,在这篇文章中我们来介绍下工厂方法模式,它同样是创建型设计模式,而且又有些类似,文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …...
http协议基础与Apache的简单介绍
一、相关介绍: 互联网:是网络的网络,是所有类型网络的母集因特网:世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上,大家把连接在因特网上的计算机都成为主机。万维网:WWW(world…...
RabbitMQ的死信队列和延迟队列
文章目录 死信队列如何配置死信队列死信队列的应用场景Spring Boot实现RabbitMQ的死信队列 延迟队列方案优劣:延迟队列的实现有两种方式: 死信队列 1)“死信”是RabbitMQ中的一种消息机制。 2)消息变成死信,可能是由于…...
PyQt 逻辑与界面分离
将逻辑与界面分离是一种良好的软件设计实践,可以提高代码的可维护性和可扩展性。在使用 pyuic 工具转换 Qt Designer 的 .ui 文件时,你可以通过以下方式实现逻辑与界面的分离: 创建一个单独的 Python 模块,用于编写主窗口的逻辑代…...
opengl播放3d pose 原地舞蹈脚来回飘动
目录 opengl播放3d pose 原地舞蹈脚来回飘动 设置相机视角 opengl播放3d pose 原地舞蹈脚来回飘动 opengl播放3d pose 原地舞蹈时,脚来回飘动,正常状态是脚应该不动的。 经过反复分析实验验证,找到原因是,渲染计算3d坐标时,都要减去一个offset,这个offset是髋关节的坐…...
Linux环境基础开发工具使用篇(三) git 与 gdb
一、版本控制器-git 1.简单理解: ①git既是服务端,又是客户端 ②git会记录版本的变化 ③git是一个去中心化的分布式软件 git/gitee 是基于git仓库搭建的网站,让版本管理可视化 2.git 三板斧提交代码 查看安装的git版本 git--version 命令行提交代…...
mybatis---->tx中weekend类
🙌首先weekend可不是mybatis中的类呦~~🙌 它是来自于mybatis的一个扩展库! 如果你要在springboot中使用,需要引入以下依赖~~ <dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot…...
Shell echo、printf、test命令
目录 Shell echo命令 打印文本消息 显示变量值 输出特殊字符 输出到文件 追加到文件 Shell printf 命令 打印简单文本 Shell test 命令 文件测试 字符串比较 整数比较 逻辑运算 Shell echo命令 打印文本消息 echo "Hello, World!" 显示变量值 name&q…...
腾讯云主机Ubuntu22.04安装Odoo17
一、安装PostgreSQL16 参见之前的文章 Ubuntu22.04安装PostgreSQL-CSDN博客 二、安装Odoo17 本方案使用的nightly版的odoo,安装的都是最新版odoo wget -O - https://nightly.odoo.com/odoo.key | apt-key add - echo "deb http://nightly.odoo.com/17.0/n…...
conda常用命令详解
Conda 是一个功能强大的包管理器和环境管理器,用于安装、部署和管理软件包和其依赖关系。下面是一些常用的 Conda 命令及其详细解释: 创建环境: conda create --name myenv python3.8可以指定创建环境的目录conda create --prefix /path/to/d…...
Java面试——锁
公平锁: 是指多个线程按照申请锁的顺序来获取锁,有点先来后到的意思。在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会…...
Spring Boot与Netty:构建高性能的网络应用
点击下载《Spring Boot与Netty:构建高性能的网络应用》 1. 前言 本文将详细探讨如何在Spring Boot应用中集成Netty,以构建高性能的网络应用。我们将首先了解Netty的原理和优势,然后介绍如何在Spring Boot项目中集成Netty,包括详…...
ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)
这里写目录标题 一,同步异常的分析1.1 同步异常分析-异常链接寄存器ELR1.2 同步异常分析-异常综合寄存器ESR,Exception Syndrome Register1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register 二, 同步异常的处理示例 Synchronous ex…...
Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索
在今天的文章中,我们将重点介绍如何使用 LangChain 提供的基础设施在 Python 中构建 Elasticsearch agent。 该 agent 应允许用户以自然语言询问有关 Elasticsearch 集群中数据的问题。 Elasticsearch 是一个强大的搜索引擎,支持词法和向量搜索。 Elast…...
学习python的第7天,她不再开放她的听歌榜单
我下午登录上小号,打开聊天消息看到了她的回复,我很开心兴奋,可是她不再开放她的听歌榜单了,我感觉得到,我要失恋了。 “因为当年电视上看没有王菲版本的” “行”。 “那你以后还会开放听歌榜单吗?”我…...
多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型
多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型 目录 多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍…...
低代码与大语言模型的探索实践
低代码系列文章: 可视化拖拽组件库一些技术要点原理分析可视化拖拽组件库一些技术要点原理分析(二)可视化拖拽组件库一些技术要点原理分析(三)可视化拖拽组件库一些技术要点原理分析(四)低代码…...
element导航菜单el-menu添加搜索功能
element导航菜单-侧栏,自带的功能没有搜索或者模糊查询。 找了找资料 找到一个比较可行的,记录一下: //index.vue的代码 <div style"overflow:auto"><el-menu :default-active"$route.path":default-openeds&…...
浅析SpringBoot框架常见未授权访问漏洞
文章目录 前言Swagger未授权访问RESTful API 设计风格swagger-ui 未授权访问swagger 接口批量探测 Springboot Actuator未授权访问数据利用未授权访问防御手段漏洞自动化检测工具 CVE-2022-22947 RCE漏洞原理分析与复现漏洞自动化利用工具 其他常见未授权访问Druid未授权访问漏…...
PostgreSQL内存上下文系统设计概述
PostgreSQL内存上下文系统设计概述 原文:src/backend/utils/mmgr/README 背景 我们在“内存上下文”中进行大部分内存分配,通常是AllocSets由src/backend/utils/mmgr/aset.c实现。在没有大量开销的情况下成功进行内存管理的关键是定义一组具有适当生命周期的有用…...
Sigma-Delta ADC选型避坑:为什么ADS124S08的‘低延迟滤波器’才是多通道轮询采集的正确打开方式
Sigma-Delta ADC选型避坑:为什么ADS124S08的‘低延迟滤波器’才是多通道轮询采集的正确打开方式 在工业传感器网络和自动化控制系统中,多通道数据采集的实时性往往比单一通道的极致精度更为关键。许多工程师在选型Sigma-Delta ADC时容易陷入一个典型误区…...
智能诊疗助手:用AI重新定义中医咨询体验
智能诊疗助手:用AI重新定义中医咨询体验 【免费下载链接】CMLM-ZhongJing 首个中医大语言模型——“仲景”。受古代中医学巨匠张仲景深邃智慧启迪,专为传统中医领域打造的预训练大语言模型。 The first-ever Traditional Chinese Medicine large languag…...
别再死记硬背了!用Python模拟光纤色散如何让信号‘变形’(附代码)
用Python动态模拟光纤色散:从高斯脉冲到信号畸变的全过程解析 光纤通信工程师们常挂在嘴边的"色散"究竟是什么?当我们在实验室用示波器观察光纤输出端的光信号时,那些波形展宽和畸变现象背后,隐藏着怎样的物理机制&…...
别再傻傻转存了!5分钟搞懂Base64图片体积计算与优化技巧(附Python/JS代码)
Base64图片体积计算的科学原理与高效优化策略 在当今数字化时代,Base64编码图片作为数据嵌入方案被广泛应用于网页开发、移动应用和数据传输场景。然而,许多开发者对Base64编码后体积膨胀的机制存在误解,导致资源浪费和性能瓶颈。本文将深入解…...
突破百度网盘限速!开源直链解析工具完全指南
突破百度网盘限速!开源直链解析工具完全指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾为百度网盘的非会员下载速度而抓狂?当下载大文件时…...
告别闪烁!STM32 HAL库硬件I2C驱动SSD1306 OLED的缓冲区设计与局部刷新实战
STM32 HAL库硬件I2C驱动SSD1306 OLED的缓冲区设计与局部刷新实战 当你在嵌入式设备上实现一个动态仪表盘时,是否遇到过屏幕频繁闪烁的问题?这种闪烁不仅影响用户体验,还可能掩盖关键数据的瞬时变化。本文将带你深入解决这个痛点,通…...
VideoAgentTrek-ScreenFilter惊艳案例:高效过滤直播流中的违规弹幕与浮动广告
VideoAgentTrek-ScreenFilter惊艳案例:高效过滤直播流中的违规弹幕与浮动广告 最近在测试一些视频处理工具时,我偶然发现了一个挺有意思的模型,叫VideoAgentTrek-ScreenFilter。这个名字听起来有点复杂,但它的功能却非常直接——…...
Docker沙箱隔离失效的7个隐性漏洞:从内核命名空间到cgroup v2的深度诊断与修复
第一章:Docker沙箱隔离失效的底层机理与风险全景Docker 的隔离能力并非源于虚拟化,而是依赖 Linux 内核的命名空间(Namespaces)和控制组(cgroups)两大机制。当这些内核原语被绕过、误配或存在漏洞时&#x…...
手机拍HDR总有重影?聊聊动态场景多帧融合的演进与手机摄影中的实际应用
手机HDR摄影中的重影难题:技术演进与实战解决方案 当你在黄昏时分举起手机,试图用HDR模式捕捉天边的晚霞与地面建筑的细节时,是否经常发现画面中走动的人物边缘出现了诡异的"重影"?这种被称为"鬼影"的现象&am…...
大学生校园兼职微信小程序pf(文档+源码)_kaic
第5章 系统实现编程人员在搭建的开发环境中,会让各种编程技术一起呈现出最终效果。本节就展示关键部分的页面效果。5.1 管理员功能实现5.1.1 兼职管理图5.1 即为编码实现的兼职管理界面,管理员在兼职管理界面中可以对界面中显示,可以对兼职信…...
