【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 请求数据
文章归档:https://www.yuque.com/u27599042/coding_star/xwrknb7qyhqgdt10 SpringBoot 接收不到 post 请求数据 接收 post 请求数据,控制器方法参数需要使用 RequestParam 注解修饰 public BaseResponseResult<Object> getMailCode(RequestParam…...
vue3学习(十四)--- vue3中css新特性
文章目录 样式穿透:deep()scoped的原理 插槽选择器:slotted()全局选择器:global()动态绑定CSScss module 样式穿透:deep() 主要是用于修改很多vue常用的组件库(element, vant, AntDesigin),虽然配好了样式但是还是需要更改其他的样式就需要用…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
