当前位置: 首页 > news >正文

【24种设计模式】工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需暴露对象创建的逻辑。在这篇博客中,我们将介绍工厂模式的概念、使用场景以及示例代码。

概念

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需暴露对象创建的逻辑。在工厂模式中,我们定义一个工厂接口,该接口包含一个创建对象的方法。然后,我们实现该接口并提供自己的实现方式。客户端代码只需要调用工厂接口的方法来创建对象,而无需关心对象的具体创建方式。

使用场景

工厂模式通常在以下情况下使用:

  • 当创建对象的过程比较复杂或需要进行大量计算时,可以使用工厂模式来隐藏对象创建的逻辑。
  • 当我们需要根据不同的条件创建不同类型的对象时,可以使用工厂模式。例如,根据不同的操作系统创建不同的对话框。
  • 当我们需要为应用程序提供可扩展性时,可以使用工厂模式。例如,我们可以通过添加新的工厂来创建新的对象类型,而无需修改现有的代码。

示例代码

下面是一个使用工厂模式创建不同类型的汽车的示例代码:

// 定义汽车接口
interface Car {void drive();
}// 实现不同类型的汽车
class SedanCar implements Car {@Overridepublic void drive() {System.out.println("Driving a sedan car");}
}class SUVCar implements Car {@Overridepublic void drive() {System.out.println("Driving an SUV car");}
}// 定义工厂接口
interface CarFactory {Car createCar();
}// 实现不同类型的工厂
class SedanCarFactory implements CarFactory {@Overridepublic Car createCar() {return new SedanCar();}
}class SUVCarFactory implements CarFactory {@Overridepublic Car createCar() {return new SUVCar();}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建不同类型的工厂CarFactory sedanCarFactory = new SedanCarFactory();CarFactory suvCarFactory = new SUVCarFactory();// 使用工厂创建不同类型的汽车Car sedanCar = sedanCarFactory.createCar();Car suvCar = suvCarFactory.createCar();// 驾驶汽车sedanCar.drive();suvCar.drive();}
}

在这个示例中,我们定义了一个汽车接口,并实现了两种不同类型的汽车。然后,我们定义了一个工厂接口,并实现了两种不同类型的工厂。最后,我们使用这些工厂来创建不同类型的汽车,并调用汽车的drive方法。

需要注意的是,客户端代码只需要使用工厂接口来创建汽车,而无需关心汽车的具体实现方式。这种方式使得代码更加灵活和可扩展。

当我们使用工厂模式时,可以将对象的创建逻辑封装在工厂类中。这样做的好处是,客户端代码与具体的对象创建逻辑解耦,使得代码更加可维护和可扩展。

工厂模式有多种变体,包括简单工厂模式、工厂方法模式和抽象工厂模式。在上面的示例中,我们使用的是简单工厂模式,其中一个工厂类负责创建不同类型的对象。下面我们来看看其他两种变体的示例。

工厂方法模式

工厂方法模式中,我们将对象的创建交给子类来处理。每个具体的产品都有一个对应的工厂类,该工厂类负责创建该产品的实例。

// 定义汽车接口
interface Car {void drive();
}// 实现不同类型的汽车
class SedanCar implements Car {@Overridepublic void drive() {System.out.println("Driving a sedan car");}
}class SUVCar implements Car {@Overridepublic void drive() {System.out.println("Driving an SUV car");}
}// 定义工厂接口
interface CarFactory {Car createCar();
}// 实现具体的工厂类
class SedanCarFactory implements CarFactory {@Overridepublic Car createCar() {return new SedanCar();}
}class SUVCarFactory implements CarFactory {@Overridepublic Car createCar() {return new SUVCar();}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建不同类型的工厂CarFactory sedanCarFactory = new SedanCarFactory();CarFactory suvCarFactory = new SUVCarFactory();// 使用工厂创建不同类型的汽车Car sedanCar = sedanCarFactory.createCar();Car suvCar = suvCarFactory.createCar();// 驾驶汽车sedanCar.drive();suvCar.drive();}
}

在这个示例中,我们定义了一个汽车接口,并实现了两种不同类型的汽车。然后,我们定义了一个工厂接口,每个具体的产品都有一个对应的工厂类,负责创建该产品的实例。最后,我们使用具体的工厂类来创建不同类型的汽车。

抽象工厂模式

抽象工厂模式是工厂方法模式的扩展,它提供了一种创建一系列相关或相互依赖对象的方式。在抽象工厂模式中,我们定义了一个抽象工厂接口,该接口包含多个创建对象的方法。然后,我们实现该接口并提供自己的实现方式。

// 定义汽车接口
interface Car {void drive();
}// 实现不同类型的汽车
class SedanCar implements Car {@Overridepublic void drive() {System.out.println("Driving a sedan car");}
}class SUVCar implements Car {@Overridepublic void drive() {System.out.println("Driving an SUV car");}
}// 定义工厂接口
interface CarFactory {Car createSedanCar();Car createSUVCar();
}// 实现具体的工厂类
class CarFactoryImpl implements CarFactory {@Overridepublic Car createSedanCar() {return new SedanCar();}@Overridepublic Car createSUVCar() {return new SUVCar();}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建工厂CarFactory carFactory = new CarFactoryImpl();// 使用工厂创建不同类型的汽车Car sedanCar = carFactory.createSedanCar();Car suvCar = carFactory.createSUVCar();// 驾驶汽车sedanCar.drive();suvCar.drive();}
}

在这个示例中,我们定义了一个汽车接口,并实现了两种不同类型的汽车。然后,我们定义了一个抽象工厂接口,该接口包含多个创建对象的方法。最后,我们使用具体的工厂类来创建不同类型的汽车。

无论是简单工厂模式、工厂方法模式还是抽象工厂模式,它们都提供了一种灵活的方式来创建对象,使得代码更加可维护和可扩展。根据实际需求,选择适合的工厂模式来创建对象,可以提高代码的可读性和可复用性。

相关文章:

【24种设计模式】工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需暴露对象创建的逻辑。在这篇博客中,我们将介绍工厂模式的概念、使用场景以及示例代码。 概念 工厂模式是一种创建型设计模式,它提供了一种创建对象的方式&#…...

树——对称二叉树

leetcode题目地址 树为空树,亦为对称二叉树树非空时,仅需判断其左右子树是否对称判断左右子树对称 (1) 左右子树是否为空,有一个为空 便不对称, 都为空或都不为空 可能对称 (2) 左右子树根节点值是否相同 (3) 判断 左子树 的 左子…...

拉扎维模拟CMOS集成电路设计西交张鸿老师课程P10~13视频学习记录

--------------------------------------------------------------------------------------------------------------------------------- p10 短沟道,除了沟长调,还可能出现速度饱和问题; 但是在拉扎维这本书里面没有考虑这个问题&#…...

3.线性神经网络

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 线性回归基础优化算法一、线性回归1、买房案例2、买房模型简化3、线性模型4、神经网络5、损失函数6、训练数据7、参数学习8、显示解9、总结 二、 基础优化算法1、梯度下降2、学习率3、小批量随机梯度下降4、批量大小5、…...

python常用内置函数的介绍和使用

Python具有丰富的内置函数,这些函数是Python语言提供的基础功能。以下是一些常用的内置函数的介绍和使用: print(): 打印输出指定的内容到屏幕。 print("Hello, World!") len(): 返回给定对象的长度或元素个数。 s "Hello, World!"…...

2023辽宁省赛E

Solution 题目大致分为三个步骤 计算 P ( S ) P(S) P(S)证明删除区间连续且找到最值位置根据最值位置求出答案 接下来过程中不合法的组合数都默认为 0 0 0 第 1 步 - 求出总值 考虑 S m { 1 , 2 , ⋯ , m } S_m \{1, 2, \cdots, m\} Sm​{1,2,⋯,m} , 则有 $P(S_{n2}…...

visual studio 启用C++11

用C11取决于你所使用的编译器和开发环境。以下是一些常见的编译器和相应的启用C11的方法: GCC (GNU Compiler Collection): 对于 GCC,你可以在编译时使用 -stdc11 或更高的标志来启用C11支持。例如: g -stdc11 yourfile.cpp -o yourprogramCl…...

获取某个抖音用户的视频列表信息

思路 确定url确定并获取相关参数构造header发送请求解析数据输出数据 运行结果 代码 import requests # 获取某个用户的的视频信息,截至20231028,程序可以正常运行。 # 构造请求头header headers {User-Agent:..........................,Cookie:...…...

【C语言】strcpy()函数(字符串拷贝函数详解)

🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.strcpy()函数简介 1.函数功能 2.函数参数 1>.char * destination 2>.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用s…...

机器学习之IV编码,分箱WOE编码

IV的概念与作用 全称是Information Value,中文的意思是信息价值,或者信息量作用: 1、构建分类模型时,经常需要对特征进行筛选。 2、挑选特征的过程考虑的因素比较多,最主要和最直接的衡量标准是特征的预测能力&#…...

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第六套区块链系统部署与运维

第六套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 子任务1-2-1: 搭建区块链系统并验证 题意: P2P起始端口 30500 channel起始端口 20500 JSONRPC 8945 使用Docker配置 使用 build_chain.sh 文件 进行生成节点文件 root@192-168-19-133:/yijiu/mode6# bas…...

山西电力市场日前价格预测【2023-10-30】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-30)山西电力市场全天平均日前电价为309.35元/MWh。其中,最高日前电价为400.33元/MWh,预计出现在18:15。最低日前电价为0.00元/MWh,预计出…...

win10虚拟机安装教程

目录 1、安装VMware 10、12、16都可以,看个人选择 2、开始安装系统(以vm16为例) 3、在虚拟机中安装win10 完成 1、安装VMware 10、12、16都可以,看个人选择 下面链是我虚拟机安装包,需要可以下载。 YR云盘 软件安…...

2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据

2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据 1、时间:2011-2021年 指标:指标:股票代码、年份、行政区划代码、行业名称、行业代码、所属省份、所属城市、数字…...

CSP-J 2023 T3 一元二次方程 解题报告

CSP-J 2023 T3 一元二次方程 解题报告 Link 前言 今年 C S P CSP CSP的原题, 回家 1 h 1h 1h内写 A C AC AC, 但是考场上没有写出来 , 原因是脑子太不好了, 竟然调了两个小时没有调出来. 一等奖悬那… 正题 看完题目,第一眼就是大模拟, 并且 C C F CCF CCF绝对不会让你好受…...

中颖单片机SH367309全套量产PCM,专用动力电池保护板开发资料

方案总体介绍 整套方案硬件部分共2块板子,包括MCU主板,采用SH79F6441-32作为主处理器。MCU主板包括2个版本。PCM动力电池保护板采用SH367309。 软件方案采用Keil51建立的工程,带蓝牙的版本,支持5~16S电池。 硬件方案--MCU主板 MC…...

Android数据对象序列化原理与应用

序列化与反序列化 序列化是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换为字节流或文本格式,以便在不同的系统之间进行传输或存…...

Linux cp命令:复制文件和目录

cp 命令,主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能。 cp 命令的基本格式如下: [rootlocalhost ~]# cp [选项] 源文件 目标文件 选项: -a&…...

SpringBoot 接收不到 post 请求数据与接收 post 请求数据

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/xwrknb7qyhqgdt10 SpringBoot 接收不到 post 请求数据 接收 post 请求数据&#xff0c;控制器方法参数需要使用 RequestParam 注解修饰 public BaseResponseResult<Object> getMailCode(RequestParam…...

vue3学习(十四)--- vue3中css新特性

文章目录 样式穿透:deep()scoped的原理 插槽选择器:slotted()全局选择器:global()动态绑定CSScss module 样式穿透:deep() 主要是用于修改很多vue常用的组件库&#xff08;element, vant, AntDesigin&#xff09;&#xff0c;虽然配好了样式但是还是需要更改其他的样式就需要用…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...