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

一、什么是工厂方法模式

        工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。这种设计模式也是 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等)可以使用不同的数据库连接对象,工厂方法可以根据需要创建不同类型的连接对象。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/204194.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis报错:JedisConnectionException: Could not get a resource from the pool

1、问题描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析: redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…

PyQt6把QTDesigner生成的UI文件转成python源码,并运行

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

NSGA-II求解微电网多目标优化调度(MATLAB)

一、NSGA-II简介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的…

python实现自动刷平台学时

背景 前一阵子有个朋友让我帮给小忙,因为他每学期都要看视频刷学时,一门平均需要刷500分钟,一学期有3-4门需要刷的。 如果是手动刷的话,比较麻烦,能否帮他做成自动化的。搞成功的话请我吃饭。为了这顿饭,咱…

Python语言学习笔记之三(字符编码)

本课程对于有其它语言基础的开发人员可以参考和学习,同时也是记录下来,为个人学习使用,文档中有此不当之处,请谅解。 什么是字符编码 计算机从本质上来说只认识二进制中的0和1,字符编码(Character Encoding) 是一种将…

Android Bitmap 模糊效果实现 (二)

文章目录 Android Bitmap 模糊效果实现 (二)使用 Vukan 模糊使用 RenderEffect 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 模糊效果实现 (二) 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134656140 最新更新地址 https:/…

便利高效双赢:无人机油气管道巡检全面升级

我国庞大的油气管道网络,包括原油、成品和天然气管道,因为地理区域广泛、建设年代久远、安全事故频发等现实因素,对管道的安全巡护与管理提出了更高的需求。在这一背景下,传统的人工巡护方式显然已经难以满足对高、精、准的要求。…

antd vue a-select 下拉框位置偏移

问题 下拉框未固定 原因 select下拉框的定位是根据body定位 解决方法 在select 标签中添加: :getPopupContainer"(triggerNode) > (triggerNode.parentElement)" :getPopupContainer"(triggerNode) > (triggerNode.parentElement)"…

Linux 面试题(一)

目录 1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令? 2、怎么查看当前进程?怎么执行退出?怎么查看当前路径? 3、怎么清屏?怎么退出当前命…

【Spring Boot】如何在Linux系统中快速启动Spring Boot的jar包

在Linux系统中先安装java的JDK 然后编写下列service.sh脚本,并根据自己的需求只需要修改export的log_path、exec_cmd参数即可 # 配置运行日志输出的路径 export log_path/usr/local/project/study-pro/logs # 当前服务运行的脚本命令 export exec_cmd"nohup /u…

redis-cluster集群

redis3.0引入的分布式存储方案 集群由多个node节点组成,redis数据分布在这些节点之中,在集群之中分为主节点和从节点 数据流程图 redis-cluster集群的工作模式 集群模式当中,主从一一对应,数据写入和读取与主从模式一样&#x…

<Linux> 文件理解与操作

目录 前言: 一、关于文件的预备知识 二、C语言文件操作 1. fope 2. fclose 3. 文件写入 3.1 fprintf 3.2 snprintf 三、系统文件操作 1. open 2. close 3. write 4. read 四、C文件接口与系统文件IO的关系 五、文件描述符 1. 理解文件描述符 2. 文…

蓝桥杯官网算法赛(蓝桥小课堂)

问题描述 蓝桥小课堂开课啦! 海伦公式(Herons formula),也称为海伦-秦九韶公式,是用于计算三角形面积的一种公式,它可以通过三条边的长度来确定三角形的面积,而无需知道三角形的高度。 海伦公…

同旺科技 USB 转 RS-485 适配器 -- 隔离型

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有: ● 支持USB 2.0/3.0接口,并兼容USB 1.1接口; ● 支持USB总线供电; ● 支持Windows系统驱动,包含WIN10 / WIN11 系统32 / 64位; ● 支持Windows …

必备极速下载工具 — aria2

必备极速多线程并行下载工具 — aria2 aria2 是一款免费开源跨平台且不限速的多线程下载软件,其优点是速度快、体积小、资源占用少;支持 HTTP / FTP / BT / Magnet 磁力链接等类型的文件下载;支持 Win、Mac、Linux 系统,甚至在树莓…

Kotlin学习——流程控制,when,循环,range工具 kt里的equals if实现类似三元表达式的效果

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

「江鸟中原」有关HarmonyOS-ArkTS的Http通信请求

一、Http简介 HTTP(Hypertext Transfer Protocol)是一种用于在Web应用程序之间进行通信的协议,通过运输层的TCP协议建立连接、传输数据。Http通信数据以报文的形式进行传输。Http的一次事务包括一个请求和一个响应。 Http通信是基于客户端-服…

黑马React18: ReactRouter

黑马React: ReactRouter Date: November 21, 2023 Sum: React路由基础、路由导航、导航传参、嵌套路由配置 路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. …

掌握你的Mac,iStat Menus带你了解mac系统状态

iStat Menus for mac是一款强大的mac系统状态监控工具,它能够提供实时的系统信息和性能监测,帮助用户全面了解和管理自己的Mac设备。无论是CPU、内存、网络、硬盘还是传感器数据,iStat Menus都能直观地展示,并且支持自定义布局和样…

easyExcel 注解开发 快速以及简单上手 以及包含工具类

easyExcel 简单快速使用 1. mevan 这里版本我这里选的是 poi 4.1.2和 ali的easyexcel 的 3.3.1。 因为阿里easy是根据poi的依赖开发的有关系,两者需要对应要不然就会有很多bug和错误在运行时发生。需要版本对应,然而就是easy的代码也会有bug这个版本是比…