当前位置: 首页 > 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;虽然配好了样式但是还是需要更改其他的样式就需要用…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...