设计模式--工厂方法模式【创建型模式】
设计模式的分类
我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:
- 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式系列文章传送门
设计模式的 7 大原则
设计模式–单例模式【创建型模式】
什么是工厂方法模式
工厂模式又叫做工厂方法模式,是一种创建型的模式,在父类提供一个创建对象的方法,允许子类决定实例化对象的类型,由子类来决定要实例化的是哪一个工厂类,工厂模式让创建对象的过程延迟到子类进行,同时也实现了调用者和实现类解耦,提高了系统的可扩展性和灵活性,这同时也是去掉众多 if else 的实现⽅式。
静态工厂方法模式
静态工厂模式通过一个工厂类来创建对象。
静态工厂方法案例
我们假设有小米、小鹏、未来三款车需要制造,车厂是根据起汽车名称来生产汽车的,当前场景可以抽象出如下类。
car 接口
定义了车名称的方法,代码如下:
public interface Car {void carName();
}
XiaoMiCar 类
XiaoMiCar 实现了 Car 接口,代码如下:
public class XiaoMiCar implements Car{@Overridepublic void carName() {System.out.println("car name is xiaomi");}
}
XiaoPengCar 类
XiaoPengCar 实现了 Car 接口,代码如下:
public class XiaoPengCar implements Car{@Overridepublic void carName() {System.out.println("car name is xiaopeng");}
}
WeiLaiCar 类
WeiLaiCar 实现了 Car 接口,代码如下:
public class WeiLaiCar implements Car{@Overridepublic void carName() {System.out.println("car name is weilai");}
}
CarFactory 生产车的工厂类
CarFactory 提供了一个根据车的名称生成 car 的类,代码如下:
public class CarFactory {//根据 car name 创建 car 对象public static Car createCarByName(String carName) {if ("xiaomi".equals(carName)) {return new XiaoMiCar();} else if ("xiaopeng".equals(carName)) {return new XiaoPengCar();} else if ("weilai".equals(carName)) {return new WeiLaiCar();} else {return null;}}}
CarClient
生产 Car 的客户端类如下:
public class CarClient {public static void main(String[] args) {Car xiaomi = CarFactory.createCarByName("xiaomi");xiaomi.carName();Car xiaopeng = CarFactory.createCarByName("xiaopeng");xiaopeng.carName();Car weilai = CarFactory.createCarByName("weilai");weilai.carName();}}
运行 CarClient 执行结果如下:
car name is xiaomi
car name is xiaopeng
car name is weilai
CarClient 类使用 CarFactory 创建出来的具体 Car 实例来实现 Car 的相关功能,这就是简单工厂模式。
可以看到静态工厂(简单工厂)模式代码实现简单,但是添加新的 Car 类型时候需要修改工厂类,对象的创建也是由工厂类来实现的。
工厂方法模式
工厂方法模式定义了一个用于创建对象的接口,让子类来决定实例化那个类。
Car
车产品属性定义接口如下:
public interface Car {//汽车品牌String getBrand();//汽车创始人String getFounder();//汽车型号String getModel();//汽车颜色String getColor();}
CarFactory
车工厂接口定义如下:
public interface CarFactory {//生产汽车接口Car createCar();}
有了车工厂定义接口,各个车品牌可以实现车工厂接口,也就是具体的车工厂实现类。
XiaoMiCarFactory
小米车工厂实现类如下:
public class XiaoMiCarFactory implements CarFactory{@Overridepublic Car createCar() {return new XiaoMiCar();}
}
XiaoPengCarFactory
小鹏车工厂实现类如下:
public class XiaoPengCarFactory implements CarFactory{@Overridepublic Car createCar() {return new XiaoPengCar();}
}
CarClient
车客户端如下:
public class CarClient {public static void main(String[] args) {XiaoMiCarFactory xiaoMiCarFactory = new XiaoMiCarFactory();Car xiaoMiCar = xiaoMiCarFactory.createCar();String brand = xiaoMiCar.getBrand();String color = xiaoMiCar.getColor();String founder = xiaoMiCar.getFounder();String model = xiaoMiCar.getModel();System.out.println(brand+"--"+founder+"--"+model+"--"+color);XiaoPengCarFactory xiaoPengCarFactory = new XiaoPengCarFactory();Car xiaoPengCar = xiaoPengCarFactory.createCar();String xiaoPengBrand = xiaoPengCar.getBrand();String xiaoPengColor = xiaoPengCar.getColor();String xiaoPengFounder = xiaoPengCar.getFounder();String xiaoPengModel = xiaoPengCar.getModel();System.out.println(xiaoPengBrand+"--"+xiaoPengFounder+"--"+xiaoPengModel+"--"+xiaoPengColor);}}
我们使用小米车工厂类生产小米汽车,使用小鹏车工厂实现类生产小鹏汽车。
执行客户端代码,执行结果如下:
小米--雷布斯--su7--蓝色
小鹏--何小鹏--小鹏P7--炫酷黑
至此工厂方法模式已经实现完毕。
思考:工厂方法给我们带来了什么作用呢?
工厂方法的优缺点
优点
- 将对象的创建过程抽离出来,使得客户端代码可以清晰的表达自己的意图,且可以与具体的车产品类解耦,提高了代码的灵活性和可读性。
- 定义了统一的工厂类接口,新增车类型只需要,实现统一的工厂类接口即可,易于扩展。
- 每种车类型都有自己的实现类,新增、修改、删除某个车类型实现类,相互补影响,减少了软件测试成本。
缺点:
- 工厂方法模式需要客户端代码实例化具体的工厂对象,这在一定程度上会导致代码的复杂性和耦合性增加。
- 工厂方法模式会增加应用程序的类的数量,我们每增加一个车类型都需要为创建一个具体工厂。
总结:本篇分享了工厂方法模式的使用方法,其中也分析了简单工厂模式,希望可以帮助到有需要的朋友。
如有不正确的地方欢迎各位指出纠正。
相关文章:
设计模式--工厂方法模式【创建型模式】
设计模式的分类 我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类: 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式(7 种)࿱…...
K8S Ingress 服务配置步骤说明
部署Pod服务 分别使用kubectl run和kubectl apply 部署nginx和tomcat服务 # 快速启动一个nginx服务 kubectl run my-nginx --imagenginx --port80# 使用yaml创建tomcat服务 kubectl apply -f my-tomcat.yamlmy-tomcat.yaml apiVersion: apps/v1 kind: Deployment metadata:n…...
32. 线程、进程与协程
一、什么是多任务 如果一个操作系统上同时运行了多个程序,那么称这个操作系统就是 多任务的操作系统,例如:Windows、Mac、Android、IOS、Harmony 等。如果是一个程序,它可以同时执行多个事情,那么就称为 多任务的程序。…...
华为实训课笔记 2024 1223-1224
华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…...
麒麟信安参编的《能源企业数字化转型能力评价 技术可控》团体标准发布
近日,中国能源研究会发布公告,《能源企业数字化转型能力评价 技术可控》团体标准发布。该标准由麒麟信安与国网湖北省电力有限公司武汉供电公司、国网智能电网研究院有限公司、中能国研(北京)电力科学研究院等单位联合编制。 《能…...
绿色环保木塑复合材料自动化生产线设计书
《绿色环保木塑复合材料自动化生产线设计书》 一、项目概述 随着全球对环境保护和可持续发展的日益重视,绿色环保材料的研发与生产成为了热门领域。木塑复合材料作为一种新型的绿色环保材料,它将木材纤维与塑料通过特定工艺复合而成,兼具木材与塑料的双重特性,具有防水、…...
渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)
本文是高级前端加解密与验签实战的第6篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过RSA加密来爆破登录。 分析 这里的代码跟上文的类似,但是加密的公钥是通过请求服务端获取的 http://127.0.0.1:8787/crypto/js/…...
数据应用与数据平台如何测试?与普通测试有什么不同?
首先我们一起了解一下数据应用测试的对象是什么。第一个是数据报表这一块,数据报表包含了我们常见的业务分析报表、经常能看到的一些数据大屏之类。 第二块是数据平台,数据应用平台主要有一些智能营销平台,比如说画像分析平台,自助…...
基于Qlearning强化学习的机器人路线规划matlab仿真
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 训练过程 测试结果 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论…...
零基础微信小程序开发——小程序的宿主环境(保姆级教程+超详细)
🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…...
用Moninfo.exe轻松获取显示器EDID
我们天天在用显示器,但显示器的一些关键参数却总是记不住。有时为了配置电脑,有时为了发挥显示器的极限性能,有时为了定制驱动,等等,都需要获取显示器的EDID数据。有些工具虽然可以读出EDID,但难以解读那一…...
【开源库 | xlsxio】C/C++读写.xlsx文件,xlsxio 在 Linux(Ubuntu18.04)的编译、交叉编译
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 2024-12-20 …...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
if语句处理多个分支时需要用if-else if结构,分支越多,嵌套的if语句层就越多,程序不但庞大、复杂,理解起来也比较困难。在C编程中,针对有些问题除了使用if-else if结构之外,还有switch语句也可以实现&#x…...
SQL Server数据库多主模式解决方案
SQL Server 本身并不直接支持多主模式(Multi-Master Replication),即多个数据库实例可以同时进行写操作,并且这些更改会自动同步到其他实例。不过,SQL Server 提供了多种高可用性和复制解决方案,可以实现类似多主模式的功能。以下是几种常见的方法: 1. Always On 可用性…...
如何训练Stable Diffusion 模型
训练Stable Diffusion模型是一个复杂且资源密集的过程,通常需要大量的计算资源(如GPU或TPU)和时间。Stable Diffusion是一种基于扩散模型的生成式AI,能够根据文本提示生成高质量的图像。它的训练过程涉及多个步骤,包括…...
网络编程(王铭东老师)笔记
网络编程的目的 1.将多个设备通过网络进行连接在一起,可以将数据共享。 基础知识-01-ip地址 1.引入 为了能够确定网络数据收发双方是哪台电脑,需要用ip来标记电脑。 2.什么是地址 地址就是用来标记地点的 3.ip地址的作用 作用:在逻辑上标…...
项目亮点案例
其实对我来说是日常操作,但是如果在面试的时候面试者能把日常的事情总结好发出来,其实足矣。 想让别人认同项目,选取的示例需要包含以下要素: 亮点项目四要素:明确的目标,问题点,解决方法和结果…...
ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用
在这篇文章《ShardingSphereProxy:快速入门》中,我们介绍了如何通过 Navicat 连接 ShardingSphere-Proxy。 实际上,ShardingSphere-Proxy 兼容标准的 SQL 和原生数据库协议,因此你可以使用任何 MySQL 客户端与其进行连接,包括 Go…...
uniapp验证码
一、 页面结构 假设你有一个发送短信按钮,点击按钮时会触发发送短信并启动倒计时。 <template><view><button click"sendSms" :disabled"isSending">{{ buttonText }}</button></view> </template>二、脚…...
C/C++基础知识复习(43)
1) 什么是运算符重载?如何在 C 中进行运算符重载? 运算符重载是指在 C 中为现有的运算符定义新的行为,使得它们能够用于用户定义的数据类型(如类或结构体)。通过运算符重载,可以让自定义类型像内置数据类型…...
GIT安装过程
文章目录 下载安装包安装过程验证安装Git的基本使用 Git的安装可以通过以下步骤完成 下载安装包 首先,访问Git官网(https://git-scm.com/)或Git for Windows(https://gitforwindows.org/)下载对应系统的安装包。 对于Windows系统,通常…...
评估大语言模型在药物基因组学问答任务中的表现:PGxQA
这篇文献主要介绍了一个名为PGxQA的资源,用于评估大语言模型(LLM)在药物基因组学问答任务中的表现。 研究背景 药物基因组学(Pharmacogenomics, PGx)是精准医学中最有前景的领域之一,通过基因指导的治疗…...
[HNCTF 2022 Week1]你想学密码吗?
下载附件用记事本打开 把这些代码放在pytho中 # encode utf-8 # python3 # pycryptodemo 3.12.0import Crypto.PublicKey as pk from hashlib import md5 from functools import reducea sum([len(str(i)) for i in pk.__dict__]) funcs list(pk.__dict__.keys()) b reduc…...
MongoDB教程001:基本常用命令(数据库操作和集合操作)
1.1 案例需求 存放文章评论的数据存放到MongoDB中,数据结构参考如下: 数据库:【articledb】 专栏文章评论comment字段名称字段含义字段类型备注_id(MongoDB自动生成)IDObjectId或StringMongo的主键的字段articleId文…...
Springboot logback 日志打印配置文件,每个日志文件100M,之后滚动到下一个日志文件,日志保留30天(包含traceid)
全部配置 logback.xml <?xml version"1.0" encoding"UTF-8"?> <configuration debug"false"><property name"LOG_HOME" value"log"/><property name"LOG_NAME" value"admin"/&g…...
flink sink kafka
接上文:一文说清flink从编码到部署上线 之前写了kafka source,现在补充kafka sink。完善kafka相关操作。 环境说明:MySQL:5.7;flink:1.14.0;hadoop:3.0.0;操作系统&#…...
vue万达地产物业缴费分析系统
摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设万达地产物业缴费分析…...
数据库 MYSQL的概念
数据库的概念 数据库是按照数据结 构来组织、存储和管理数据的系统,它允许用户高效地存储、检索、更新和管理数据 database:用来组织,存储,管理数据的仓库 数据库的管理系统:DBMS,实现对数据的有效储值&am…...
docker 容器的基本使用
docker 容器 一、docker是什么? 软件的打包技术,就是将算乱的多个文件打包为一个整体,打包技术在没有docker容器之前,一直是有这种需求的,比如上节课我把我安装的虚拟机给你们打包了,前面的这种打包方式是…...
Nginx IP优化限制策略
Nginx 如何限制每个 IP 地址的连接数,优化资源分配? Nginx 限制每个 IP 地址的连接数 Nginx 提供了多种机制来限制单个 IP 地址所能建立的同时连接数,这对于防止资源耗尽和提高服务稳定性至关重要。以下是几种有效策略: 1. 使用…...
某科技局国产服务器PVE虚拟化技术文档
环境介绍 硬件配置 服务器品牌:黄河 型号:Huanghe 2280 V2 Cpu型号:kunpeng-920 磁盘信息 :480SSD * 2 ,4T*4 网卡:板载四口千兆 如下表 四台服务器同等型号配置,均做单节点虚拟化,数据保护采用底层r…...
新能源汽车锂离子电池各参数的时间序列关系
Hi,大家好,我是半亩花海。为了进一步开展新能源汽车锂离子电池的相关研究,本文主要汇总并介绍了电动汽车的锂离子电池的各项参数,通过 MATLAB 软件对 Oxford Dataset 的相关数据集进行数据处理与分析,进一步研究各项参…...
单片机:实现自动关机电路(附带源码)
单片机实现自动关机电路 在许多嵌入式系统或便携式设备中,自动关机功能非常重要,尤其是在电池供电的设备中,防止设备长时间开启以节省电能。自动关机电路的基本功能是检测设备是否处于待机状态,若一定时间内未收到用户操作信号或…...
/etc/fstab 文件学习systemd与该文件关系
文章目录 一、文件字段1.1、设备标识1.2、挂载点1.3、文件系统类型1.4、挂载选项1.5、dump1.5、fsck顺序 二、/etc/fstab 与systemd 的关系2.1、/etc/fstab 与systemd 的关系2.2、systemd 之前/etc/fstab生效过程2.3、systemd 时代/etc/fstab生效过程 三、相关知识3.1、如何更具…...
springcloud基础
一 SpringCloud简介 1.1 SpringCloud是什么 SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFli…...
全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式
目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…...
HTML+CSS+JS制作汽车网站(内附源码,含5个页面)
一、作品介绍 HTMLCSSJS制作一个汽车网站,包含首页、新车发布页、预约试驾页、最新资讯页、品牌故事页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部导航栏 包含logo、主导航菜单(首页、新车、二…...
GraalVM完全指南:云原生时代下使用GraalVM将Spring Boot 3应用转换为高效Windows EXE文件
一、前言 在现代软件开发中,启动速度和资源利用率常常是衡量应用性能的关键指标。对于基于Spring Boot的应用来说,虽然它们易于开发和部署,但JVM的启动时间有时会成为一个瓶颈。本文介绍如何使用GraalVM将Spring Boot 3应用编译成原生Windows可执行文件(EXE),从而显著提…...
微软开源GraphRAG的使用教程-使用自定义数据测试GraphRAG
微软在今年4月份的时候提出了GraphRAG的概念,然后在上周开源了GraphRAG,Github链接见https://github.com/microsoft/graphrag,截止当前,已有6900Star。 安装教程 官方推荐使用Python3.10-3.12版本,我使用Python3.10版本安装时,在…...
C++ 中的字面量类型定义
在 C 中,字面量类型(Literal Type)是指可以作为字面量使用的类型。字面量是指代码中直接写出的常量值,比如整数 42、浮点数 3.14、字符串 "hello" 等。而字面量类型则是支持创建这些字面量的类型。 C 中的字面量类型定…...
LeetCode:101. 对称二叉树
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输…...
Docker Compose 配置指南
目录 1. Docker Compose 配置1.1 基本配置结构1.2 docker-compose.yml 的各部分1.3 常用配置选项 2. Docker Compose 使用方法2.1 创建 Docker Compose 配置文件2.2 启动服务2.3 查看容器状态2.4 查看服务日志2.5 停止服务2.6 重新构建服务 3. Docker Compose 常用命令3.1 dock…...
【Linux开发工具】自动化构建-make/Makefile
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux开发工具】gcc和g 🔖流水不争,争的是滔滔不 一、make和Makefile简介1.1 什么是…...
VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)
名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…...
Python 异步协程:从 async/await 到 asyncio 再到 async with
在 Python 3.8 以后的版本中,异步编程变得越来越重要。本文将系统介绍 Python 标准库中的异步编程工具,带领大家掌握 async/await 语法和 asyncio 的使用。 从一个简单的场景开始 假设我们在处理一些耗时的 I/O 操作,比如读取多个文件或处理…...
矩阵-向量乘法的行与列的解释(Row and Column Interpretations):中英双语
本文是学习这本书的笔记 网站是:https://web.stanford.edu/~boyd/vmls/ 矩阵-向量乘法的行与列的解释 矩阵-向量乘法(Matrix-Vector Multiplication)是线性代数中的基本操作,也是机器学习、数据科学和工程中常用的数学工具。本文…...
针对超大规模病理图像分析!华中科技大学提出医学图像分割模型,提高干燥综合征诊断准确性
口干、眼干、皮肤干,每天伴有不明原因的肌肉酸痛和全身乏力,如果以上症状你「中招」了,除了考虑冬季天气干燥外,还应该警惕一种常见却总是被我们忽视的疾病——干燥综合征 (Sjgren’s Syndrome, SS)。 干燥综合征是以外分泌腺高度…...
混合开发环境---使用编程AI辅助开发Qt
文章目录 [toc]1、说明2、演示视频 1、说明 新时代的浪潮早就已经来临,上不了船的人终将被抛弃,合理使用AI辅助开发、提升效率是大趋势 注意:不要被AI奴隶 合理使用AI辅助编程,十倍提升效率。 大部分的编程AI都有vs code插件&…...
Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
本文仅作学习交流,不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本:Unity6 模板:3D 核心 渲染管线:URP ------------------------------…...
[前端]HTTP库Axios
一、Axios简介 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 node.js 环境。它是一个流行的 JavaScript 库,用于发起 HTTP 请求,如 GET、POST、DELETE 等。Axios 提供了易于使用的 API,支持请求和响应的拦截、转换数据格…...