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

设计模式-创建型模式-工厂方法模式

一、什么是工厂方法模式

        工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

二、场景模拟

        假设我们要给一个成本计算系统设计一套各种材料的成本计算。其中材料有钢板、油漆、运输等成本,每个成本需要计算单条记录成本,本周成本和月度成本。

三、业务实现

        首先我们定义一下成本接口 ICosts,里面有三个方法,分别是SingleCosts(),WeekCosts()和

MonthCosts()。

3.1、定义成本接口

成本接口 ICosts,模拟三个方法,计算单个成本、本月成本和本周成本;

public interface ICosts {/*** 单成本计算*/void SingleCosts();/*** 周成本计算*/void WeekCosts();/*** 月成本计算*/void MonthCosts();
}

3.2、定义具体实现类 

首先是钢板类材料实现类

public class GBCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("计算钢板成本");}@Overridepublic void WeekCosts() {System.out.println("计算本周钢板成本");}@Overridepublic void MonthCosts() {System.out.println("计算本月钢板成本");}
}

然后是油漆

public class YQCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("计算油漆成本");}@Overridepublic void WeekCosts() {System.out.println("计算本周油漆成本");}@Overridepublic void MonthCosts() {System.out.println("计算本月油漆成本");}
}

最后是运输

public class YSCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("计算运输成本");}@Overridepublic void WeekCosts() {System.out.println("计算本周运输成本");}@Overridepublic void MonthCosts() {System.out.println("计算本月运输成本");}
}

3.3、定义成本计算工厂

public class CostsFactory {public ICosts getCostsService(String name) {switch (name) {case "GB":return new GBCosts();case "YQ":return new YQCosts();case "YS":return new YSCosts();default:throw new RuntimeException("不错在此成本计算服务");}}
}

3.4、测试

public static void main(String[] args) {CostsFactory costsFactory = new CostsFactory();ICosts GBCosts = costsFactory.getCostsService("GB");GBCosts.SingleCosts();GBCosts.WeekCosts();GBCosts.MonthCosts();ICosts YQCosts = costsFactory.getCostsService("YQ");YQCosts.SingleCosts();YQCosts.WeekCosts();YQCosts.MonthCosts();}

可以看到既满足了业务的需求,也满足了自己对代码的追求。这样的代码不必有大量的if-else存在,而且扩展性更强,代码结构更加清晰。

四、总结

        工厂方法模式(Factory Method Pattern)是一种创建型设计模式,用于创建对象的过程被推迟到子类中进行,这样可以使一个类的实例化延迟到其子类。这种模式通过定义一个创建对象的接口,但是由子类决定要实例化的类是哪一个。

        当使用时只需要调用抽象工厂接口来创建即可,不需要了解具体的实现和创建逻辑。例如在数据库操作中,针对不同的数据库类型(Mysql、Oracle等)可以使用不同的数据库连接对象,工厂方法可以根据需要创建不同类型的连接对象。

        通过工厂方法,我们可以在客户端代码中对产品的具体类型进行抽象,并通过子类来创建相应的对象,从而提供了更大的灵活性和可扩展性。

相关文章:

设计模式-创建型模式-工厂方法模式

一、什么是工厂方法模式 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。…...

科研/比赛必备工具及系列笔记集合

科研/比赛必备工具及系列笔记集合 零、前言一、常用工具系列1.1 笔记平台使用感受系列1.2 常用开发平台系列 二、论文系列2.1 检索工具系列2.2 投稿调研系列2.3 常见国际期刊/会议2.4 常见中文核心期刊/会议 三、文献系列3.1 画图工具系列3.2 翻译工具系列3.3 英文纠正系列3.4 …...

萨科微举办工作交流和业务分享会

萨科微(www.slkoric.com)举办工作交流和业务分享会,狠抓人才培养团队的基本功建设。萨科微总经理宋仕强先生认为,当下市场经济形势复杂多变,给公司经营带来巨大压力,同时考验着企业自身的发展韧性。萨科微公…...

一篇文章让你入门python集合和字典

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、集合: 增加 add 删除 del 删除集合 discard(常用)删除集合中的元素 ,删除一个不存在的元素不会报错 remove 删除一个不存在的元素会报错 pop随…...

各种工具的快捷键或命令

前言 这里就存放自己存有的一些小工具的地址以及工具的命令。 正文 零、各种小工具 1、wizTree:磁盘分析工具-分析磁盘的文件夹存储 2、稻壳阅读器:有黑色背景 3、youtube 视频下载:https://zh.savefrom.net/226/ 4、视频录制:Bandica…...

【Web】preg_match绕过相关例题wp

目录 ①[FBCTF 2019]rceservice ②[ctfshow]web130 ③[ctfshow]web131 ④[NISACTF 2022]middlerce 简单回顾一下基础 参考文章 p牛神文 preg_match绕过总的来讲就三块可利用 数组绕过、PCRE回溯次数限制、换行符 ①[FBCTF 2019]rceservice 先贴出附件给的源码 &l…...

XSLVGL2.0 User Manual 主题管理器(v2.0)

XSLVGL2.0 开发手册 XSLVGL2.0 Brief 1、概述2、特性3、APIs3.1、xs_page_theme_register3.2、xs_page_get_theme_current3.3、xs_page_set_theme_current3.4、xs_page_get_theme_count3.5、xs_page_get_theme_id3.6、xs_page_get_theme_name3.7、xs_page_get_theme4、使用方法…...

visionOS空间计算实战开发教程Day 2 使用RealityKit显示3D素材

我们在​​Day1​​中学习了如何创建一个visionOS应用,但在第一个Demo应用中我们的界面内容还是2D的,看起来和其它应用并没有什么区别。接下来我们先学习如何展示3D素材,苹果为方便开发人员,推出了RealityKit,接下来看…...

【图解系列】一张图带你了解 DevOps 生态工具

一张图带你了解 DevOps 生态工具 ✅ 协作(Collaborate):JIRA、Confluence 大家肯定不陌生了,我之前也写过利用 Jekyll 搭建个人博客的帖子。✅ 构建(Build):常用的 SCM(Software Con…...

Oracle的安装及使用流程

Oracle的安装及使用流程 1.Win10安装Oracle10g 1.1 安装与测试 安装版本: OracleXEUniv10.2.1015.exe 步骤参考:oracleXe下载与安装 安装完成后测试是否正常 # 输入命令连接oracle conn sys as sysdba; # 无密码,直接按回车 # 测试连接的s…...

CMakeLists.txt:打印find_package变量;判断库文件路径设定是否正确;install文件设置

CMake打印find_package变量;install文件设置 打印find_package找到的各种变量判断库文件是否被找到install文件设置install详细说明 打印find_package找到的各种变量 目的:find_package后,想使用找到的include/lib文件夹。 find_package(Yo…...

Mysql 解决Invalid default value for ‘created_at‘

在mysql版本 8.0 和 5.* 之间数据互导的过程中,老是会出现各种错误,比如 这个created_at 一定要有一个默认值, 但是我加了 default null 还是会报错,于是对照了其他的DDL 发现,需要再加 null default null 才行&#…...

Linux【安全 01】云服务器主机安全加固(修改SSHD端口、禁用登陆失败的IP地址、使用密钥登录)

云服务器主机安全加固 1.SSH登录尝试的系统日志信息2.安全加固方法2.1 修改SSHD端口2.2 禁用登陆失败的IP地址2.3 使用密钥登录 3.总结 1.SSH登录尝试的系统日志信息 Last failed login: Sat Oct 7 14:10:39 CST 2023 from xxx.xx.xx.xxx on ssh:notty There were 10 failed …...

nginx的n种用法(nginx安装+正向代理+反向代理+透明代理+负载均衡+静态服务器)

nginx的安装 一、安装依赖 # 一键安装四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel二、安装nginx yum install nginx三、检查是否安装成功 nginx -v四、启动/停止nginx /etc/init.d/nginx start /etc/init.d/nginx stop五、编辑配置文件…...

lvm 扩容根分区失败记录

lvm 扩容根分区失败记录 1、问题描述2、错误描述3、解决方法重启系统进入grub界面,选择kernel 2.x 启动系统。然后同样的resize2fs命令扩容成功。 1、问题描述 根分区不足。 系统有2个内核版本,一个是kernel 2.x,另一个是kernel 4.x。 这次l…...

【机器学习】聚类(一):原型聚类:K-means聚类

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. Kmeans类a. 构造函数b. 闵可夫斯基距离c. 初始化簇心d. K-means聚类e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令…...

2824. 统计和小于目标的下标对数目 --力扣 --JAVA

题目 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < target 的下标对 (i, j) 的数目。 解题思路 对数组进行排序&#xff0c;可以利用List自带的sort函数传递比较规则(代码中的…...

github上不去

想要网上找代码发现github上不去了 发现之前的fastgit也用不了了 搜了很多地方终于找到了 记录保存一下 fastgithub最新下载 选择第二个下载解压就行 使用成功&#xff01;...

图像处理Scharr 算子

Scharr算子是用于图像边缘检测的一种算子&#xff0c;它类似于Sobel算子&#xff0c;但是对边缘的响应更加强烈。它可以用来检测图像中的边缘、轮廓等特征。 原理&#xff1a; Scharr算子是一种卷积核&#xff08;也称为卷积模板&#xff09;&#xff0c;用于计算图像的梯度。…...

JAVA 面向对象编程

一. 类与对象 1.1 定义类 &#xff1a;类是由数据成员和成员方法组成的一个程序单元。数据成员表示类的属性&#xff0c;成员方法表示类的行为。 定义类的语法格式 : class 类名{数据类型 数据成员名;...public 返回值类型 方法名(参数 2, 参数 2 ...){// 方法体[return 表达…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】

1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命

一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中&#xff0c;每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战&#xff1a; 效率瓶颈&#xff1a;工人每小时仅能处理200-300件&#xff0c;且存在间歇性疲劳安全隐患&#xff1a;20kg以上重箱搬运导致年…...