Java工厂模式详解 - 打造高效可扩展的软件架构

Java工厂模式详解 - 打造高效可扩展的软件架构

引言

在软件开发的世界里,设计模式是帮助开发者解决常见问题的有效工具。工厂模式作为一种创建型设计模式,为创建对象提供了一种抽象化的方式,从而减少了代码之间的耦合度,提高了系统的可扩展性。本文将详细介绍Java中的工厂模式,并通过示例代码展示其实际应用。

一、工厂模式概述

工厂模式(Factory Pattern)是一种创建对象的最佳实践。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式主要解决了对象创建的直接依赖问题,将对象的创建与使用分离,使得系统更加灵活和可扩展。

二、工厂模式的分类

  1. 简单工厂模式(Simple Factory Pattern)

简单工厂模式是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自同一父类或接口)的实例。

示例代码:

public interface Car {void drive();
}public class BMW implements Car {@Overridepublic void drive() {System.out.println("Driving BMW");}
}public class Mercedes implements Car {@Overridepublic void drive() {System.out.println("Driving Mercedes");}
}public class CarFactory {public static Car createCar(String type) {if ("BMW".equals(type)) {return new BMW();} else if ("Mercedes".equals(type)) {return new Mercedes();}return null;}
}
  1. 工厂方法模式(Factory Method Pattern)

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类将实例化延迟到子类中进行。

示例代码:

public interface CarFactory {Car createCar();
}public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMW();}
}public class MercedesFactory implements CarFactory {@Overridepublic Car createCar() {return new Mercedes();}
}
  1. 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

示例代码:

public interface CarFactory {Car createCar();Engine createEngine();
}public interface Car {void drive();
}public interface Engine {void start();
}public class BMWCar implements Car {@Overridepublic void drive() {System.out.println("Driving BMW");}
}public class BMWEngine implements Engine {@Overridepublic void start() {System.out.println("Starting BMW Engine");}
}public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMWCar();}@Overridepublic Engine createEngine() {return new BMWEngine();}
}

三、工厂模式的应用场景

  1. 当需要根据不同的参数创建不同实例时,可以使用工厂模式。
  2. 当一个类不知道它所必须创建的对象的类的时候,可以使用工厂模式。
  3. 当一个类希望由它的子类来指定它所创建的对象时,可以使用工厂方法模式。
  4. 当需要创建一系列相互关联或依赖的产品对象时,可以使用抽象工厂模式。

四、工厂模式的优缺点

优点:

  1. 减少了代码之间的耦合度。
  2. 提高了系统的可扩展性。
  3. 遵循了开闭原则(对扩展开放,对修改关闭)。

缺点:

  1. 增加了系统的复杂度,需要引入额外的工厂类。
  2. 当产品类较多时,工厂类的代码可能会变得非常庞大。

五、总结

工厂模式在Java软件开发中具有重要的地位,它提供了一种灵活且可扩展的方式来创建对象。通过合理地使用工厂模式,我们可以降低代码之间的耦合度,提高系统的可维护性和可扩展性。在实际项目中,根据具体的需求和场景选择合适的工厂模式,将有助于我们打造出更加高效和稳定的软件架构。

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

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

相关文章

React18源码: reconciler执行流程

reconciler执行流程 1 )概述 此处先归纳一下react-reconciler包的主要作用,将主要功能分为4个方面: 输入:暴露api函数(如:scheduleUpdateOnFiber), 供给其他包(如react包&#xff0…

sentinel中监听器的运用--规则管理

sentinel中监听器的运用–规则管理 规则结构 类图关系 类关系图如下 Rule 将规则抽象成一个类, 规则与资源是紧密关联的, 也就是说规则作用于资源。因此, 我们需要将规则表示为一个类, 并包含一个获取资源的方法 这里采用接口的原因就是规则是一个抽象概念而非具体实现。…

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者:Web3 Foundation Team 编译:OneBlock 原文:https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划(Decentralized Voices Program&…

云图极速版限时免费活动

产品介绍 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用,致力于协助用户发现并管理互联网资产攻击面。 实战数据 (2023.11.6 - 2024.2.23) 云图极速版上线 3 个月以来,接入用户 3,563 家,扫描主体 19,961 个,累计发…

洛谷P4995 跳跳!

跳跳! 题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去。 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 i i i 块的石头高度为 h i h_i hi​,地面的高度是 h 0 …

SQL注入:网鼎杯2018-unfinish

目录 使用dirmap扫描 使用dirsearch扫描 使用acunetix扫描 爆破后端过滤的字符 绕过限制获取数据 这次的进行SQL注入的靶机是:BUUCTF在线评测 进入到主页面后发现是可以进行登录的,那么我们作为一个安全人员,那肯定不会按照常规的方式来…

js 文件预览 在窗口设置“自定义名称”

1. 最近需要做一个点击表格某一列的标题,预览当前文件的一个小功能。本身功能很简单,点击该标题,预览文件,那么拿到他对应的文件地址,在浏览器打开就行了。 2. 事实如此,使用window.open(url, _blank);就行…

【QT-lineEidte动画效果

QT-lineEidte动画效果 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #ifndef DynamicUnderlineLineEdit_H #define DynamicUnderlineLineEdit_H#include <QWidget> #include <QLineEdit> #include <QPainter> #include <QPaintEvent…

HTML5新婚、年会、各种聚会的现场抽奖活动(附源码)

文章目录 1.抽奖平台设计来源1.1 主界面效果1.2 抽奖效果1.3 中奖效果 2.效果和源码配置2.1 动态效果2.2 人员信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

最长公共前缀【简单】

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例如下&#xff1a; 所给提示如下&#xff1a; 1 < strs.length < 2000 < strs[i].length < 200strs[i] 仅由小写英文字母组成 解题 根据…

使用 C++23 协程实现第一个 co_await 同步风格调用接口--Qt计算文件哈希值

C加入了协程 coroutine的特性&#xff0c;一直没有动手实现过。看了网上很多文章&#xff0c;已经了解了协程作为“可被中断和恢复的函数”的一系列特点。在学习过程中&#xff0c;我发现大多数网上的例子&#xff0c;要不就是在main()函数的控制台程序里演示yeild,await, resu…

集合是干嘛的?解决了什么问题?

通常并不能确切地知道最终需要多少个对象。有些时候甚至想用更复杂的方式来保存对象。为解决这个问题&#xff0c;Java 提供了四种类型的“集合类”&#xff1a;Vector&#xff08;矢量&#xff09;、BitSet&#xff08;位集&#xff09;、Stack&#xff08;堆栈&#xff09;以…

【动态规划专栏】背包问题:01背包

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

个人博客系列-前端部署-创建框架(4)

项目环境介绍 Vue3 Vite TypeScript 服务器&#xff1a;阿里云contos node版本&#xff1a;v18.18.2 npm版本&#xff1a;v10.2.4 执行下面一行命令&#xff0c;创建vue3框架 npm create vuelatest修改端口&#xff1a;9528&#xff0c; 此步骤可以忽略&#xff08;使用默…

Chrome Captcha自动解决器,如何下载CapSolver

在数字时代&#xff0c;CAPTCHA&#xff08;Completely Automated Public Turing tests to tell Computers and Humans Apart&#xff0c;完全自动区分计算机和人类的公共图灵测试&#xff09;作为一项重要的安全措施&#xff0c;用于保护网站免受自动机器人的攻击。然而&#…

儿子刚上初一就很叛逆怎么办?家长们可以试试这样教育!

初一正处于青春期&#xff0c;叛逆是很正常的一种成长现象&#xff0c;这个时候的他们是控制不好自己情绪的&#xff0c;和家长对着干几乎成为了一种本能&#xff0c;他们总会觉得自己爸爸妈妈这不对那不对这不懂那也不懂&#xff0c;所以极其叛逆。 针对初中生&#xff0c;主…

一款跳转警告HTML单页模板源码

一款跳转警告HTML单页模板,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码如下 <!DOCTYPE html> <html> <!--QQ沐编程 www.q…

5个精美的wordpress中文企业主题模板

元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板&#xff0c;适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题&#xff0c;适合用于搭建教育培训公司官方…

uniapp插件uViewplus的使用(涉及TS下的问题)

在技术选型后最后定了使用有团队维护的uview-plus3.0,官方文档 配置参考&#xff1a;https://juejin.cn/post/7169875753100640270 ts配置参考&#xff1a;https://blog.csdn.net/m0_70027114/article/details/132957426 引入 在项目文件的pages.json中的"easycom"…

【SpringCloudAlibaba系列--OpenFeign组件】OpenFeign的配置、使用与测试以及OpenFeign的负载均衡

步骤一 准备两个服务&#xff0c;provider和consumer 本文使用kotlin语言 provider是服务的提供者&#xff0c;由provider连接数据库 RestController RequiredArgsConstructor RequestMapping("/provider/depart") class DepartController(private val departServ…