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

设计模式 抽象工厂方法模式

定义与特点

工厂方法模式(FactoryMethod),定义一个创建产品对象的工厂接口,让工厂子类决定实例化那一个产品类。工厂方法使一个类的实例化延迟到其子类。
我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。
如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”(可以通过反射克服该缺点)。
工厂方法模式核心组件
工厂方法模式是在简单工厂模式上的改进,主要包含如下几个角色及组件

工厂方法模式核心组件
  • 抽象工厂(Creator):整个工厂模式的核心角色,它与应用无关,主要在创建模式中规范和产品对应的工厂对象的标准化定义。
  • 具体工厂(Concrete Creator):实现了抽象工厂的具体工厂类,该类型是和应用直接交互的具体实现类,在应用程序中调用,用于创建产品对象。
  • 抽象产品(Product):工厂方法模式创建的所有类型的超级父类,该类型和具体业务有关,用于规范工厂方法模式中创建的方法对象具备的公共特征行为。
  • 具体产品(Concrete Product):该类型实现了抽象产品 父类,是工厂方法模式中具体创建的实例对象。
工厂方法模式优缺点
优点:

在简单工厂模式上的改进,核心工厂类不再负责所有产品的构建,而是将具体的工作交给子类进行实现,不再接触和业务相关的具体细节,如此进一步抽象的结果,最直接的作用就是在满足OCP原则的基础上实现了功能的扩展。

缺点:

软件的水平功能扩展已经非常可观,但是对于新功能扩展,灵活性上稍有欠缺,在横向扩展时如果出现新的业务逻辑就需要更改原有的工厂类型代码予以满足了。

第一种方式
// 抽象方法
public interface SimpleFactory<T> {/*** 获取具体产品实例的方法* @return 返回创建的实例对象*/T product();
}
// 实体对象
public interface Product {/*** 产品类型的公共方法* @return 返回产品信息*/String getInformation();
}public class Test1Product implements  Product{@Overridepublic String getInformation() {return "测试 Test1 product 信息";}
}public class Test2Product implements Product{@Overridepublic String getInformation() {return "测试 Test2 Product 信息";}
}public class Test1Factory implements SimpleFactory<Product>{@Overridepublic Product product() {return new Test1Product();}
}public class Test2Factory implements SimpleFactory<Product>{@Overridepublic Product product() {return new Test2Product();}
}Test1Factory test1Factory = new Test1Factory();
Product test1product = test1Factory.product();
System.out.println(test1product.getInformation());
Test2Factory test2Factory = new Test2Factory();
Product test2product = test2Factory.product();
System.out.println(test2product.getInformation());
第二种方式
package simpleFactoryModel;public class Simp1Factory {private static Product product;public static void setProduct(Product product) {if(product != null){Simp1Factory.product = null;}}public static Product getProduct(String text) {if (product == null) {// 每次锁定一个对象synchronized (Simp1Factory.class) {if("test1".equals(text)){product = new Test1Product();}if("test2".equals(text)){product = new Test2Product();}}}return product;}
}Simp1Factory simp1Factory = new Simp1Factory();
Product test1 = Simp1Factory.getProduct("test1");
Simp1Factory.setProduct(test1);
Product test2 = Simp1Factory.getProduct("test2");
System.out.println(test1.getInformation());
System.out.println(test2.getInformation());

相关文章:

设计模式 抽象工厂方法模式

定义与特点 工厂方法模式&#xff08;FactoryMethod&#xff09;&#xff0c;定义一个创建产品对象的工厂接口&#xff0c;让工厂子类决定实例化那一个产品类。工厂方法使一个类的实例化延迟到其子类。 我们把被创建的对象称为“产品”&#xff0c;把创建产品的对象称为“工厂…...

PowerShell 一键配置IP

前言 实现一键更改Windows 网卡IP,子网,网关,dns,重命名网卡,获取的接口索引名称,获取接口名称,刷新组策略,刷新系统,脚本可重复配置,,以下环境我是两个网卡配置IP 前提条件 开启wmi,配置网卡,参考 创建更改网卡脚本 实验环境,两个网卡,清除默认,重命名(配置)…...

【Pyhthon读取 PDF文件表格 ,转为 CSV/TSV/JSON文件】

tabula-py tabula-py 是一个将 PDF 表格转换为 pandas DataFrame 的工具。 tabula-py 是 tabula-java 的包装器&#xff0c;需要您的机器上有 java。 tabula-py 还允许您将 PDF 中的表格转换为 CSV/TSV 文件。 tabula-py 的 PDF 提取准确度与 tabula-java 或 tabula app 相…...

<数据集>商品条形码识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3748张 标注数量(xml文件个数)&#xff1a;3748 标注数量(txt文件个数)&#xff1a;3748 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Barcode] 序号类别名称图片数框数1Barcode37484086 使用标注工具&am…...

无人机系统的关键技术

一、飞控系统&#xff1a;是无人机完成整个飞行过程的关键&#xff0c;决定了无人机的飞行性能和稳定性。 二、导航系统&#xff1a;提供无人机所需的位置、速度和飞行姿态等信息&#xff0c;引导无人机按照指定航线飞行。 三、动力系统&#xff1a;提供飞行动力&#xff0c;…...

(24)(24.4) MultiWii/DJI/HDZero OSD (version 4.2 and later)(一)

文章目录 前言 1 基于遥测的OSD 前言 ArduPilot 使用基于MSP&#xff08;MultiWii 串行协议&#xff09;的协议支持多种类型的屏幕显示&#xff08;OSD&#xff09;&#xff1a; 基于 MSP 遥测的操作系统&#xff0c;如大疆 FPV 护目镜 V1/V2、大疆护目镜 RE、FatShark Byte…...

HiveSQL:提取json串内容——get_json_oject和json_tuple

提取json串中内容&#xff0c;json格式示例如下 方法&#xff08;运行环境Hive&#xff09; get_json_objectjson_tuple get_json_object select json_data,get_json_object(json_data,$.price) as price -- 取第一层,get_json_object(json_data,$.inquiry_params) as in…...

Clickhouse 二进制安装

下载对应版本https://github.com/ClickHouse/ClickHouse 分别选择arm64/x86_64 对应的tgz 场景是需要把ck所有文件安装指定目录&#xff0c;使用rpm会散布在各个目录不方便管控 下载client,common-static,server这三个 将相同的目录合并成一个&#xff08;这里注意需要在l…...

大数据开发工程师面试整理-项目经验

在面试或职业发展中,分享项目经验是展示个人能力和专业知识的重要途径。大数据开发工程师的项目经验通常涉及数据处理、系统设计、性能优化以及与团队协作等多个方面。以下是如何有效地展示大数据项目经验的指导,以及一个示范性的项目经验描述。 1. 结构化描述项目经验 ● 项…...

游戏引擎详解——图片

图片 图片的格式 图片文件格式pngjpg 纹理压缩格式ETC1/2PVRTCASTC 图片的属性 图片属性解释分辨率宽高像素值&#xff08;pt&#xff09;&#xff0c;如&#xff1a;1024*1024位深度用来存储像素颜色的值&#xff0c;如RGBA8888&#xff0c;红黄蓝透明度4个维度每个8bit&…...

电商API数据接口在电商运营电商数据分析中的作用?

电商运营中&#xff0c;品牌方使用电商API数据接口可以带来众多益处&#xff0c;具体包括但不限于以下几点&#xff1a; 实时数据同步&#xff1a;通过API接口&#xff0c;品牌方可以实时获取商品库存、订单状态、价格变动等信息&#xff0c;保证数据的时效性和准确性&#xff…...

Java OkHttp使用(二)

文章目录 引言使用 OkHttp 发送回调其他 引言 记录一下 OkHttp 的使用&#xff1b;OkHttp 异步发送回调请求&#xff0c;增加回调失败重试。 使用 OkHttp 发送回调 /*** 回调重试类*/ Data public class CallBackRetryData {/*** 回调信息JSON*/private JSONObject bodyRequ…...

宝塔(bt.cn)面板新手小白使用中常见问题

1.新手小白-服务器正确的安装宝塔的粗略教程 购买服务器后首先是挂载磁盘再安装宝塔&#xff0c;步骤不要搞错,免得安全后磁盘空间不对需要挂载多免费异步&#xff0c;切记切记 挂载磁盘&#xff1a;&#xff08;挂载磁盘只需一行命令即可&#xff0c;请根据自己的系统选择正确…...

【LeetCode:3133】数组最后一个元素的最小值(Java)

题目链接 3133. 数组最后一个元素的最小值 题目描述 给你两个整数 n 和 x 。你需要构造一个长度为 n 的 正整数 数组 nums &#xff0c;对于所有 0 < i < n - 1 &#xff0c;满足 nums[i 1] 大于 nums[i] &#xff0c;并且数组 nums 中所有元素的按位 AND 运算结果为…...

FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘解决方法

出现这个问题的原因是导入文件时默认类型选错了&#xff0c;修改文件类型即可 如图右键导入文件&#xff0c;选择“Options for File OLED.C” 选择“File Type”,将头文件文件类型修改为“Text Documents file”&#xff0c;将.c文件文件类型修改为“C Sorce file” 第二方…...

自行车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化

在当今这个日新月异的数字化时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;自行车制造5G智能工厂工业物联数字孪生平台的兴起&#xff0c;无疑是这场转型浪潮中一股强劲力量。自行车制造5G智能工厂工业物联数字孪生平台的成功应用&#xff0c;不仅仅是技术上的突破…...

一文彻底搞懂Transformer - FFNN(前馈神经网络)

Transformer 神经网络&#xff1a; 神经网络&#xff08;Neural Networks&#xff09;是一种模仿生物神经网络的结构和功能的数学或计算模型。它由大量的人工神经元&#xff08;也称为节点或处理单元&#xff09;相互连接而成&#xff0c;这些神经元之间通过带有权重的连接进行…...

SpringCloud Gateway及 Springboot 服务 跨域配置

SpringCloud Gateway 跨域配置 配置文件 #跨域支持 spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers[0]* spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[0]* spring.cloud.gateway.globalcors.cors-configuration…...

【Solidity】安全与校验

信息传输 发送方 A&#xff1a; 计算消息 message 的哈希值 H&#xff1a;hash(message) H 私钥 privateKey ➕ 哈希值 H &#x1f7f0; 签名 signature&#xff1a;signature sign(H, privateKey) 将消息 message 和签名 signature 发送给 B 接收方 B&#xff1a; 计算…...

黑神话悟空四十二项修改器 v1.0

软件简介 黑神话悟空四十二项修改器由风灵月影精心打磨&#xff0c;为《黑神话悟空》这款备受瞩目的游戏量身定制。这款修改器界面简洁、体积小巧、功能强大&#xff0c;它致力于为玩家提供便捷的游戏体验&#xff0c;让您能够根据个人喜好和需求&#xff0c;轻松调整游戏内的…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

生信服务器 | 做生信为什么推荐使用Linux服务器?

原文链接&#xff1a;生信服务器 | 做生信为什么推荐使用Linux服务器&#xff1f; 一、 做生信为什么推荐使用服务器&#xff1f; 大家好&#xff0c;我是小杜。在做生信分析的同学&#xff0c;或是将接触学习生信分析的同学&#xff0c;<font style"color:rgb(53, 1…...