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

设计模式之工厂模式讲解与案例

工厂模式是一种创建对象的设计模式,它通过提供一个统一的接口来创建对象,隐藏了具体对象的实例化过程。Java中的工厂模式有多种实现方式,下面我将举两个常见的例子。

简单工厂模式(Simple Factory Pattern):

简单工厂模式通过一个工厂类来创建对象,根据不同的参数类型返回相应的实例。这种方式适用于创建的对象较少且不会频繁修改的情况。

// 抽象产品接口
interface Product {void use();
}// 具体产品类A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品A");}
}// 具体产品类B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品B");}
}// 简单工厂类
class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}throw new IllegalArgumentException("Unsupported product type.");}
}// 使用工厂创建产品
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();  // 输出:使用产品AProduct productB = SimpleFactory.createProduct("B");productB.use();  // 输出:使用产品B}
}

工厂方法模式(Factory Method Pattern):

工厂方法模式将对象的创建交给子类来实现,每个子类负责创建一种具体的产品。这种方式适用于需要创建多种具体产品的情况。


// 抽象产品接口
interface Product {void use();
}// 具体产品类A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品A");}
}// 具体产品类B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品B");}
}// 抽象工厂类
abstract class Factory {public abstract Product createProduct();
}// 具体工厂类A
class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂类B
class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 使用工厂创建产品
public class Main {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.use();  // 输出:使用产品AFactory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.use();  // 输出:使用产品B}
}

总结

上面两种方式有什么不同

简单工厂模式和工厂方法模式的主要区别在于创建对象的方式不同。

简单工厂模式通过一个工厂类来创建对象,客户端只需要知道所需产品的类型即可获得该产品的实例,具有较高的简洁性。但是它的缺点是工厂类中包含了所有产品的实现逻辑,当新增加产品时需要修改工厂类的代码,违背了开闭原则

工厂方法模式将创建对象的行为交给了子类来实现,每个具体工厂类只负责创建一种具体产品,更符合开闭原则。但是它的缺点是需要为每个产品都创建一个对应的具体工厂类,增加了类的数量,复杂度较高。

因此,在使用工厂模式时,需要根据实际情况选择相应的实现方式。如果产品的种类较少且不会频繁变化,可以考虑使用简单工厂模式;如果产品的种类较多且会经常变化,可以选择工厂方法模式。

相关文章:

设计模式之工厂模式讲解与案例

工厂模式是一种创建对象的设计模式,它通过提供一个统一的接口来创建对象,隐藏了具体对象的实例化过程。Java中的工厂模式有多种实现方式,下面我将举两个常见的例子。 简单工厂模式(Simple Factory Pattern)&#xff1a…...

(免费领源码)php#MySQL软件测试文档管理系统28035-计算机毕业设计项目选题推荐

目 录 摘 要 Abstract 第1章 前 言 1.1 研究背景 1.2 开发意义 1.3 系统开发目标 第2章 系统开发环境 6 2.1 HTTP协议 6 2.2 HTML网页技术 6 2.3 B/S结构 6 2.4 PHP脚本语言 7 2.5 MySQL数据库 7 2.6 Apache简介 8 第3章 需求分析 3.1 需求分析 3.2 系统可…...

05.Oracle数据库对象

Oracle数据库对象 Oracle数据库对象是指在Oracle数据库中存储和管理数据的各种实体。以下是一些常见的Oracle数据库对象: 表(Table):用于存储数据的基本结构。表由一组列(Column)组成,每列定义了…...

某国产中间件企业:提升研发安全能力,助力数字化建设安全发展

​某国产中间件企业是我国中间件领导者,国内领先的大安全及行业信息化解决方案提供商,为各个行业领域近万家企业客户提供先进的中间件、信息安全及行业数字化产品、解决方案及服务支撑,致力于构建安全科学的数字世界,帮助客户实现…...

Servlet中主要的内置对象

Servlet中有一些内置对象,它们提供了与 Web 容器和客户端交互的功能。这些对象在开发Servlet时可以直接使用,无需显式创建。 一些主要的内置对象包括: HttpServletRequest:代表客户端的HTTP请求,提供访问请求的内容&am…...

STL-set和map

目录 一、pair和make_pair 1. pair 2. make_pair 二、set (一)set的模板参数列表 (二)set的构造 (三)set的插入 1. 测试1 2. 测试2 (四)low_bound和upper_bound&#xff…...

【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件

文章目录 1.ProgressBar2. ImageList3.ListView控件 1.ProgressBar 用于显示某个操作的进度。 属性: Value: 表示当前进度条的值,其范围由Min和Max决定。Step: 设置每次调用PerformStep()方法时增加的步长。MarqueeAnimationSpeed: 在Style设置为Marq…...

写一个简单实用的Excel工具类

我们在开发中经常要将数据导入成Excel表格供展示&#xff0c;也需要解析Excel中的数据&#xff0c;官方提供的api操作太麻烦&#xff0c;这边封装了一个Excel工具类&#xff0c;可以很轻松的实现Excel的操作 首先加入依赖 <dependencies><!-- EasyPoi 基本库依赖 --…...

C#中LINQtoObjects、LINQtoDataSet和LINQtoXML

目录 一、使用LINQ操作数组和集合 二、使用LINQ操作DataSet数据集 1.AsEnumerable()方法 2.CopyToDataTable()方法 3.AsDataView()方法 4.Take()方法 5.Sum()方法 6.示例 &#xff08;1&#xff09;源码 &#xff08;2&#xff09;生成效果 三、使用LINQ操作XML 1.…...

k8s中 RBAC中,clusterrole,serviceaccount , rolebinding 是什么关系谁先谁后

在Kubernetes的RBAC&#xff08;Role-Based Access Control&#xff09;中&#xff0c;ClusterRole、ServiceAccount和RoleBinding是三个关键的组件&#xff0c;它们之间的关系如下&#xff1a; ClusterRole&#xff1a;ClusterRole 是一种全局的权限规则&#xff0c;它定义了一…...

什么是文件安全

文件安全就是通过实施严格的访问控制措施和完美的权限卫生来保护您的业务关键信息不被窥探&#xff0c;除了启用和监控安全访问控制外&#xff0c;整理数据存储在保护文件方面也起着重要作用。通过清除旧的、过时的和其他垃圾文件来定期优化文件存储&#xff0c;以专注于关键业…...

maven的settings.xml和pom.xml配置文件详解

一、配置文件 maven的配置文件主要有 settings.xml 和pom.xml 两个文件。 其中在maven安装目录下的settings.xml&#xff0c;如&#xff1a;D:\Program Files\apache-maven-3.6.3\conf\settings.xml 是全局配置文件 用户目录的.m2子目录下的settings.xml&#xff0c;如&#…...

YB2503HV 100V 3A SOP8内置MOS 高效率降压IC(昱灿)

YB2503HV 100V 3A SOP8内置MOS 高效率降压IC 描述&#xff1a; YB2503HV是单片集成可设定输出电流的开关型降压恒压驱动器&#xff0c;可工作在宽输入电压范围具有优良的负载和线性调整度。安全保护机制包括每周期的峰值限流、软启动、过压保护和温度保护。YB2503HV需要非常少…...

Redis安装Linux

1、下载安装包 wget http://download.redis.io/releases/redis-3.0.0.tar.gz 2、安装 mkdir /usr/local/redis cp redis-3.0.0.tar.gz /usr/local/redis cd /usr/local/redis tar -zxvf redis-3.0.0.tar.gz cd /usr/local/redis/redis-3.0.0 make PREFIX/usr/local/red…...

PCL点云处理(007)-Ransac

随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。 RANSAC算法本质上由两步组成&#xff0c;不断进行循环&#xff1a; 从输入数据中随机选出能组成数学模型的最小数目的元素&#xff0c;使用这些元素…...

有方N58 HTTP POST 请求连接 TDengine

串口调试软件&#xff1a;格西调试精灵 第一步先注册网络获取IP地址 建立PPP连接 ATXIIC1\r PPP链路建立成功&#xff0c;查询IP地址 ATXIIC?\r 设置网络APN ATCREG?\r 运行结果&#xff0c;红线处是获…...

基于Python+Pygame实现一个滑雪小游戏

目录 项目介绍Pygame介绍项目文件夹介绍演示视频代码免费领取 一、项目介绍 使用介绍&#xff1a;运行main.py文件后&#xff0c;通过左右按键可以控制小人的移动&#xff0c;如果经过旗杆那么10分&#xff0c;如果碰到树木那么减50分。 二、Pygame介绍 Pygame是一个用于游…...

【限制输入框值类型】自定义指令el-input输入类型限制,vue和html两个版本

前言 经常遇到输入框需要限制只能输入数字的&#xff0c; 因为用户很离谱&#xff0c;明显输入数字的地方他非要输入英文或者中文 但是用到UI框架或者自己写方法验证表单比较麻烦 为了一个输入框专门去弄一个验证很麻烦 所以这里就整合了两种自定义指令的方式&#xff0c;更加…...

对一个金融风控测额公式的理解(1)

目录 公式&#xff1a;&#xff08;近3个月回款总额/过去3个月的FBA平均库存价值&#xff09;*最近FBA的库存价值*过去13周FBA发货比例 详细讨论一下这个&#xff1a;&#xff08;近3个月回款总额/过去3个月的FBA平均库存价值&#xff09; 既然&#xff08;近3个月回款总额/…...

【GEE】2、探索数据集

1简介 在本单元中&#xff0c;我们将讨论以下概念&#xff1a; Google 地球引擎中可用的潜在数据来源。 通过生态示例显示的数据集采样用例。 如何使用 Google 地球引擎访问重要的元数据。 2背景 要将遥感集成到您的研究和分析中&#xff0c;学习如何解析 Google 地球引擎上…...

开启AI端侧能源新纪元 豪鹏科技亮相CIBF 2026

导读&#xff1a;豪鹏科技锚定“AI端侧电池固态电池”双轮驱动核心路径&#xff0c;完成从传统电池制造商到AI端侧能源引领者的跨越式转型&#xff0c;以硬核技术与前瞻布局&#xff0c;领航端侧能源产业迈向高质量发展新征程。以下为文章正文&#xff1a;图片来源于电池百人会…...

生态数据分析避坑指南:你的Mantel检验结果可靠吗?聊聊距离算法选择与共线性控制

生态数据分析避坑指南&#xff1a;你的Mantel检验结果可靠吗&#xff1f;聊聊距离算法选择与共线性控制 生态数据分析中&#xff0c;Mantel检验作为一种常用的空间相关性分析方法&#xff0c;被广泛应用于物种分布与环境因子关系的研究。然而&#xff0c;许多研究者在实际操作中…...

别再只盯着p值和FC了!用DisGeNET给你的Hub Gene打分,提升下游验证成功率

别再只盯着p值和FC了&#xff01;用DisGeNET给你的Hub Gene打分&#xff0c;提升下游验证成功率 在基因功能研究的海洋中&#xff0c;Hub Gene如同灯塔般指引着研究方向。然而&#xff0c;许多研究者仍被困在传统筛选方法的局限中——过度依赖差异表达基因的p值和fold change阈…...

Vivado 2022.1里Floating-point IP核的隐藏技巧:如何优化开方运算的延迟与资源消耗

Vivado 2022.1浮点开方IP核深度调优&#xff1a;从参数配置到硬件实现的黄金法则 在FPGA信号处理系统中&#xff0c;浮点运算单元往往是性能瓶颈所在。当设计一个实时性要求极高的雷达信号处理链路时&#xff0c;我曾在某型号的Xilinx UltraScale器件上遭遇过这样的困境&#x…...

Display Driver Uninstaller:专业显卡驱动清理工具完全指南

Display Driver Uninstaller&#xff1a;专业显卡驱动清理工具完全指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninsta…...

拆解Xilinx UltraScale GTH收发器时钟网络:从QPLL/CPLL选择到TXUSRCLK生成的全链路分析

拆解Xilinx UltraScale GTH收发器时钟网络&#xff1a;从QPLL/CPLL选择到TXUSRCLK生成的全链路分析 在高速串行通信领域&#xff0c;时钟网络的稳定性直接决定了系统性能上限。当我们面对25Gbps甚至更高速率的设计需求时&#xff0c;Xilinx UltraScale架构中的GTH收发器便成为工…...

NCM解密终极指南:3步解锁网易云音乐加密文件

NCM解密终极指南&#xff1a;3步解锁网易云音乐加密文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在官方客户端播放&#xff0c;无法在其他设备或播放器上欣赏&…...

Utools插件分离功能详解:像浏览器开标签页一样,同时运行多个效率工具

Utools插件分离功能实战&#xff1a;打造多窗口并行工作流的高效引擎 在数字工作时代&#xff0c;效率工具的价值早已超越了单一功能的实现&#xff0c;而在于如何无缝融入复杂的工作场景。对于开发者、内容创作者和知识工作者而言&#xff0c;真正的痛点往往不在于缺少工具&am…...

基于ESP32的嵌入式AI语音交互系统:从硬件设计到软件实现全解析

1. 项目概述&#xff1a;从零打造一个会聊天的嵌入式AI伙伴几年前&#xff0c;当我第一次把“小爱同学”拆开&#xff0c;看到里面密密麻麻的芯片和电路时&#xff0c;一个念头就冒了出来&#xff1a;能不能自己动手&#xff0c;用一块开发板&#xff0c;从头搭建一个能听会说、…...

网盘直链解析助手:一站式解决多平台文件下载难题

网盘直链解析助手&#xff1a;一站式解决多平台文件下载难题 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …...