【设计模式】-工厂方法模式
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个用于创建对象的接口,但是将具体对象的创建推迟到子类中。这样,子类可以决定要实例化的对象类型。工厂方法模式提供了一种方式,通过将对象的创建延迟到子类中,来解耦对象的生产和使用。
原理
在工厂方法模式中,我们有一个抽象的工厂类,该类定义了一个创建对象的接口,但是不负责具体的创建过程。该工厂类的子类负责具体的对象创建,每个子类都可以通过实现工厂接口的方式来创建自己的对象。
在实际应用中,我们经常需要根据不同的条件或者参数来创建不同的对象。使用工厂方法模式,我们可以通过不同的工厂子类来创建不同的对象,而无需在使用对象的地方编写判断条件或者创建对象的具体代码。
代码示例
下面是一个使用Java语言实现的工厂方法模式的示例代码:
抽象工厂类
// 抽象工厂类
public abstract class Factory {// 创建对象的方法,由子类实现public abstract Product createProduct();
}
具体工厂类
// 具体工厂类A,负责创建具体产品A
public class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂类B,负责创建具体产品B
public class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}
抽象产品类
// 抽象产品类
public abstract class Product {// 产品的公共方法public abstract void use();
}
具体产品类
// 具体产品类A
public class ConcreteProductA extends Product {@Overridepublic void use() {System.out.println("使用具体产品A");}
}// 具体产品类B
public class ConcreteProductB extends Product {@Overridepublic void use() {System.out.println("使用具体产品B");}
}
使用工厂方法模式的示例
public class Client {public static void main(String[] args) {// 创建具体工厂AFactory factoryA = new ConcreteFactoryA();// 通过具体工厂A创建具体产品AProduct productA = factoryA.createProduct();// 使用具体产品AproductA.use();// 创建具体工厂BFactory factoryB = new ConcreteFactoryB();// 通过具体工厂B创建具体产品BProduct productB = factoryB.createProduct();// 使用具体产品BproductB.use();}
}
在上述示例中,我们定义了一个抽象工厂类 Factory,包含了一个用于创建产品的抽象方法 createProduct。我们还定义了两个具体工厂类 ConcreteFactoryA 和 ConcreteFactoryB,这两个工厂类分别负责创建具体产品类 ConcreteProductA 和 ConcreteProductB。最后,我们定义了一个抽象产品类 Product,以及两个具体产品类 ConcreteProductA 和 ConcreteProductB。
在 Client 类中,我们通过具体工厂类来创建具体产品对象,并使用这些对象。通过使用工厂方法模式,我们可以将对象的创建和使用分离,便于扩展和维护。
工厂方法模式在实际开发中有着广泛的应用,尤其适用于需求频繁变动的场景。通过使用工厂方法模式,我们可以更加灵活地创建和使用对象,并且符合面向对象设计的开闭原则。
相关文章:
【设计模式】-工厂方法模式
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个用于创建对象的接口,但是将具体对象的创建推迟到子类中。这样,子类可以决定要实例化的对象类型。工厂方法模式提供了一种方式,通…...
H7-TOOL的高速DAPLINK用于新版STM32CubeIDE V1.13及其以上版本的超简单实现方法(2023-08-08)
之前分享了一个方法,太繁琐了,H7-TOOL群的群友提供了一个方法,实现非常简单。1、使用STM32CubeMX或者自己创建一个STM32CubeIDE工程后,设置这两个地方即可: 配置调试器,设置完毕记得点击右下角的Apply 2、然…...
成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】
成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】 问题描述解决方案 问题描述 在下载安装包的时候一直卡在0% [Waiting for headers],报错信息如下: Get:1 file:/var/cudnn-local-repo-ubuntu1804-8.5.0.96 InRelease […...
openLayers实战(一):vue项目中的离线地图引入
最近的项目涉及到离线地图的操作,查阅社区文章,决定使用openLayersvue离线地图的方式进行开发,前期基础引入操作完全参考掘金文章,非常优秀全面的文章。 openlayers 实战离线地图 - 掘金 此外,开发过程的地图操作可参考…...
如何构造一个安全的单例?
为什么要问这个问题? 我们知道,单例是一种很常用的设计模式,主要作用就是节省系统资源,让对象在服务器中只有一份。但是实际开发中可能有很多人压根没有写过单例这种模式,只是看过或者为了面试去写写demo熟悉一下。那…...
单片机开发 esp8266
一、固件界面 二、项目介绍 固件名称:esp8266-universalboard v1.0 提供商: 半条虫(466814195) 下载:esp8266-universalboard.bin 源码地址:Gitlab...
Linux 查看版本和用户权限提升实践心得
文章目录 linux (Ubuntu内核)查看版本版本信息解释内置yum工具?用户权限提升操作步骤 查看deepin系统的版本和其debian的版本遇到的问题:deepin-release文件不存在 linux (Ubuntu内核)查看版本 使用lsb_release命令: lsb_release -a该命令将…...
多线程编程5:线程同步和进程通信(C++11和linux)
常见的线程同步 linux: 互斥锁:实现共享资源的串行访问,有三个版本普通锁(默认属性),检错锁(可以防止相同线程重复加锁)和递归锁(相同线程可以重复加锁)条件变量:配合互斥锁使用,实现线程之间的通信&#…...
tensorrt官方int8量化方法汇总
原理及操作 量化的基本原理及流程可参看懂你的神经网络量化教程:第一讲、量化番外篇、TensorRT中的INT8、tensorRT int8量化示例代码 Tensorrt 方式1:trtexec(PTQ的一种) int8量化 trtexec --onnxXX.onnx --saveEnginemodel.…...
21、p6spy输出执行SQL日志
文章目录 1、背景2、简介3、接入3.1、 引入依赖3.2、修改database参数:3.3、 创建P6SpyLogger类,自定义日志格式3.4、添加spy.properties3.5、 输出样例 4、补充4.1、参数说明 1、背景 在开发的过程中,总希望方法执行完了可以看到完整是sql语…...
实力认证!TDengine 入选 Gartner 中国数据分析与人工智能技术成熟度曲线
近日,国际权威研究机构 Gartner 发布了《2023 年中国数据分析及人工智能技术成熟度曲线》(即《Hype Cycle for Data, Analytics and AI in China, 2023》)报告,TDengine 成功入选实时数据管理领域代表产品。 作为评估全球新技术成…...
如何将jar包部署到宝塔
尝试多种方式上传,但启动一直失败,这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided,如果是固定的版本号会出现问题 之后就可以打包啦,直接点击maven中的package 找到打包文件的位置ÿ…...
el-tree-select那些事
下拉菜单树形选择器 用于记录工作及日常学习涉及到的一些需求和问题 vue3 el-tree-select那些事 1、获取el-tree-select选中的任意层级的节点对象 1、获取el-tree-select选中的任意层级的节点对象 1-1数据集 1-2画面 1-3代码 1-3-1画面代码 <el-tree-selectv-model"s…...
分布式任务调度框架之开山鼻祖:Quartz
1.简介 最近我司上线使用了分布式任务调度框架:XXL-JOB,方便对任务的管理控制。本来一开始就想讲述一下该框架,但是在学习了解过程中发现该框架式基于Quartz思想开发实现的,Quartz 是一个很火的开源任务调度框架,完全…...
Django实现音乐网站 ⑺
使用Python Django框架制作一个音乐网站, 本篇主要是后台对歌手原有实现功能的基础上进行优化处理。 目录 新增编辑 表字段名称修改 隐藏单曲、专辑数 姓名首字母 安装xpinyin 获取姓名首字母 重写保存方法 列表显示 图片显示处理 引入函数 路径改为显示…...
PO、DTO和VO的区别
PO:Persistence Object,是持久化对象,也叫实体对象(Entity),是对象到关系表的映射。在关系型数据库中,每张表对应着一个PO,PO 中的属性值与表中数据一一对应,通过数据访问…...
ReadableStream流的js处理
需求 今天接了一个gpt的项目。需要对接接口。后端返回的数据是ReadableStream类型的。记录下如何处理ReadableStream类型的数据 代码 const response ... // response 是服务端返回的数据// 创建了一个数据读取器 const reader response.getReader(); // 创建了一个文本解…...
图扑软件入选 2023 中国信通院“铸基计划”全景图
7 月 27 日,由中国信通院主办的“2023 数字生态发展大会”暨中国信通院“铸基计划”年中会议在北京召开。本次大会重磅发布了《高质量数字化转型产品及服务全景图(2023 上半年度)》。图扑软件凭借自研 HT for Web 数字孪生可视化产品成功入选…...
Go Fyne:一种现代的,跨平台的 GUI 开发工具集
Fyne 是一个用 Go 语言写的,提供丰富,现代化的用户界面(UI)的开发工具集。Fyne 提供了一种简单而直观的方式来构建应用程序,并且注意到它是跨平台的,可以在 Windows,macOS,Linux&…...
React Dva 操作models中的subscriptions讲述监听
接下来 我们来看一个models的属性 之前没有讲到的subscriptions 我们可以在自己有引入的任意一个models文件中这样写 subscriptions: {setup({ dispatch, history }) {console.log(dispatch);}, },这样 一进来 这个位置就会触发 这里 我们可以写多个 subscriptions: {setup…...
GLM-4.1V-9B-Base基础教程:Web界面支持的图片格式/大小/分辨率清单
GLM-4.1V-9B-Base基础教程:Web界面支持的图片格式/大小/分辨率清单 1. 模型简介 GLM-4.1V-9B-Base是智谱开源的视觉多模态理解模型,专门用于处理图像内容识别、场景描述、目标问答和中文视觉理解任务。这个模型已经完成了Web化封装,可以直接…...
别再手动点啦!用Android无障碍服务+讯飞语音,5分钟实现App语音操控(保姆级教程)
用Android无障碍服务打造语音操控神器:5分钟实现"可见即可说" 你是否厌倦了在手机上反复点击屏幕的操作?想象一下,只需对着手机说出"打开微信"、"点击朋友圈"、"返回主页",设备就能自动完…...
Dynamic Deep Learning for Li-ion Battery Fault Detection: A Practical Approach with Real-world EV Da
1. 动态深度学习在锂电池故障检测中的核心价值 锂电池作为电动汽车的核心部件,其健康状况直接关系到整车的安全性和可靠性。传统基于阈值的检测方法在面对复杂多变的实际工况时,往往表现不佳。我们团队在实际测试中发现,某品牌车辆在低温环境…...
Wan2.2-I2V-A14B效果对比:LSTM时序预测辅助下的动态剧情生成
Wan2.2-I2V-A14B效果对比:LSTM时序预测辅助下的动态剧情生成 1. 引言 想象一下,当你输入一段文字描述,AI不仅能生成对应的视频,还能像专业导演一样把控剧情节奏和情感起伏。这正是Wan2.2-I2V-A14B结合LSTM时序预测技术带来的突破…...
Linux系统CPU负载与使用率详解及性能监控
1. CPU负载与CPU使用率的本质区别在Linux系统监控和性能调优过程中,CPU负载和CPU使用率这两个指标经常被混淆使用。作为系统管理员,我曾多次遇到团队成员将这两个概念混为一谈的情况,这往往导致对系统性能问题的误判。让我们先从一个实际案例…...
MATLAB与AI结合:使用Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF进行科学计算与数据分析
MATLAB与AI结合:使用Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF进行科学计算与数据分析 1. 科研与工程中的智能计算新范式 想象一下这样的场景:你正在处理一组复杂的实验数据,需要快速实现滤波、拟合和可视化。传统方式可能需要…...
终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据
终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser 在处理第三方AP…...
MusePublic Art Studio效果展示:复杂提示词(多主体/空间关系/光照条件)解析能力
MusePublic Art Studio效果展示:复杂提示词(多主体/空间关系/光照条件)解析能力 1. 创作工具新体验 MusePublic Art Studio让AI图像生成变得像使用画笔一样简单。这个工具专门为创作者设计,不需要懂任何代码技术,通过…...
Phi-3-mini-4k-instruct-gguf开发者案例:为微信小程序后端提供的轻量API服务
Phi-3-mini-4k-instruct-gguf开发者案例:为微信小程序后端提供的轻量API服务 1. 项目背景与需求 在开发微信小程序时,我们经常需要为前端提供智能文本处理能力,比如自动生成商品描述、智能客服回复、内容摘要等。传统方案要么需要调用第三方…...
Pixel Couplet Gen部署案例:混合云架构(公有云API+私有云模型)方案
Pixel Couplet Gen部署案例:混合云架构(公有云API私有云模型)方案 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。该项目基于ModelScope大模型驱动,通过创新的8-bit像素游戏UI设…...
