Java基础:设计模式之简单工厂模式

简单工厂模式是一种创建型设计模式,它通过一个专门的类(即工厂类)负责创建对象,从而将对象的创建过程与客户端代码解耦。简单工厂模式的核心在于提供一个统一的入口,接收外界请求并根据请求参数返回相应的对象实例,隐藏了对象的具体创建细节。

一、简单工厂模式的结构

简单工厂模式涉及以下几个角色:

  1. 工厂类(Factory):这是模式的核心,它负责创建具体的产品对象。通常包含一个静态工厂方法,根据传入的参数判断应该创建何种产品对象,并返回该对象的实例。

  2. 抽象产品(Abstract Product):定义了产品对象的公共接口,通常是一个接口或抽象类,包含了所有具体产品必须实现的方法。

  3. 具体产品(Concrete Products):实现了抽象产品的接口,代表了可创建的不同产品对象。每个具体产品对应工厂类中的一个特定产品类型。

二、简单工厂模式的工作原理

当客户端需要创建一个产品对象时,不直接调用具体产品类的构造函数,而是通过调用工厂类的静态工厂方法。工厂方法根据传入的参数(如产品类型标识)决定应该实例化哪个具体产品类,并返回该对象的实例。客户端只知道传入参数和抽象产品接口,无需关心产品对象的实际创建过程。

三、Java示例

假设甜品店可以制作绿豆沙和芝麻糊两种甜品。我们可以创建一个甜品(Dessert)接口和两个具体甜品类(MungBeanSoup、BlackSesamePaste),再使用一个甜品工厂(DessertFactory)来创建甜品。

// 抽象产品(Abstract Product)
public interface Dessert {String getName();
}// 具体产品(Concrete Products)
public class MungBeanSoup implements Dessert {@Overridepublic String getName() {return "绿豆沙";}
}public class BlackSesamePaste implements Dessert {@Overridepublic String getName() {return "芝麻糊";}
}// 工厂类(Factory)
public class DessertFactory {public static Dessert createDessert(String type) {if ("绿豆沙".equals(type)) {return new MungBeanSoup();} else if ("芝麻糊".equals(type)) {return new BlackSesamePaste();} else {throw new IllegalArgumentException("无法识别的甜品类型");}}
}// 客户端代码
public class Client {public static void main(String[] args) {Dessert dessert = DessertFactory.createDessert("绿豆沙");System.out.println("制作了一份:" + dessert.getName());}
}

在这个示例中,DessertFactory是简单工厂,createDessert方法是静态工厂方法。客户端通过传递字符串参数指定要创建的甜品种类,工厂根据参数返回相应的甜品实例。

四、简单工厂模式的问题

虽然简单工厂模式简化了对象的创建过程,但它也存在一些局限性和潜在问题:

  1. 违反开闭原则:当需要添加新的产品类型时,必须修改工厂类的代码,增加新的分支判断。这意味着每次扩展产品集时,都需要修改工厂类,违反了开闭原则(对扩展开放,对修改关闭)。随着产品种类的增多,工厂类可能会变得庞大且难以维护。

  2. 集中式逻辑:所有的产品创建逻辑都集中在工厂类中,如果创建过程复杂或者有大量产品类型,会导致工厂类的职责过重,不易于理解和测试。

  3. 无法应对复杂的创建条件:当产品创建逻辑依赖于复杂的逻辑判断或需要访问外部资源时,简单工厂模式可能无法优雅地处理这些情况,需要引入更复杂的设计。

  4. 不符合单一职责原则:工厂类除了负责创建对象外,还承担了识别产品类型的任务,这可能导致职责不单一,增加了代码的耦合度。

综上所述,简单工厂模式适用于产品种类相对较少且创建逻辑较为简单的情况。当系统需要支持灵活的产品扩展且遵循开闭原则时,可能需要考虑使用工厂方法模式或抽象工厂模式来替代。

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

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

相关文章

Linux系统上C++使用alsa库播放声音文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、命令行1.ffmpeg2.aplay 二、代码实现总结 前言 平常读麦克风的场景居多,有时候也需要播放一个声音文件,这里就介绍怎么处理。 一、…

自动驾驶光学校准反射板

光学校准反射板是一种用于光学系统校准的重要工具。它以其高反射率和精确的几何特性,为光学仪器、光学系统和光学元件的校准提供了可靠的参考。在现代光学领域,光学校准反射板的应用已经深入到各个领域,从科学研究到工业生产,都离…

# IDEA2019 如何打开 Run Dashboard 运行仪表面板

IDEA2019 如何打开 Run Dashboard 运行仪表面板 段子手168 1、依次点击 IDEA 上面工具栏 —> 【View】 视图。 —> 【Tool Windows】 工具。 —> 【Run Dashboard】 运行仪表面板。 2、如果 【Tool Windows 】工具包 没有 【Run Dashboard】 运行仪表面板 项 依次…

慈航医疗“五进”实践活动第九场:范庄村爱心义诊,村民健康有“医”靠

为落实推进“健康中国”战略,提升居民健康意识和预防疾病能力,4月18日,慈航医疗健康前往范庄村开展健康义诊活动,为100余位村民送上了一份暖心的公益关爱。 义诊当天,在志愿服务队队员的引领下,慈航医疗健康…

数据结构|树形结构|并查集

数据结构|并查集 并查集 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 有趣的并查集剧情演绎:【算法与数据结构】—— 并…

JavaScript —— APIs(三)

一、事件流 (一)定义 (二)事件捕获 事件捕获,对话框从大到小弹出,先弹出爷爷,最后弹出儿子 (三)事件冒泡 冒泡事件,对话框从小到大弹出,先弹出…

详解QString与QByteArray使用对比

QString与QByteArray是Qt库中两种不同的字符串/字节序列容器,各自服务于特定的应用场景。本篇文章将详细解析它们的异同,帮助您在实际编程中准确选择和有效地使用这两种类型。 参考 QString类的使用 相同之处 构造与初始化: 两者都支持直接使…

Apache Answer 开源问答社区安装体验

Answer 是由 SegmentFault 思否团队打造的一款问答平台软件,后端使用 Go 语言编写,于2022年10月24日(程序员节)正式开源。你可以免费使用 Answer 高效地搭建一个问答社区,并用于产品技术问答、客户支持、用户交流等场景。 2023年10月9日,Answer 顺利通过投票,以全票通过…

Binlog、Redo 和 Undo 的概念与区别

目录 Binlog(Binary Log) Redo Log(重做日志) Undo Log(回滚日志) Binlog 与 Redo Log 和 Undo Log 的区别 Binlog(Binary Log) Binlog,即二进制日志,是M…

华为sr-mpls policy配置案例

SR-MPLS POLICY在ensp上面做不了,这是官方上的配置

编译Milkv-duo固件

Milk-V Duo 是一款基于 CV1800B 芯片的超紧凑型嵌入式开发平台。它可以运行Linux和RTOS,为专业人士、工业ODM、AIoT爱好者、DIY爱好者和创作者提供可靠、低成本、高性能的平台。 硬件 CPU:CVITEK CV1800B (C9061Ghz C906700MHz)双 RV64 内核&#xff…

node+vue3的websocket前后端消息推送

nodevue3的websocket前后端消息推送 前期写web项目时,前端获取数据的方式一般是向后端发起数据请求,然后后端向前端发送数据,然后对数据进行渲染,这是最常规的一种数据通讯方式,适用于绝大部分前后端分离的项目 实际…

多项式和Bezier曲线拟合

目录 1. 多项式拟合2. Bezier曲线拟合3. 源码地址 1. 多项式拟合 在曲线拟合中,多项式拟合方法的性能受到三个主要因素的影响:采样点个数、多项式阶数和正则项。 采样点个数 N N N:从Figure 1中可以看出较少的采样点个数可能导致过拟合&…

2024统计建模:大数据与人工智能时代的统计研究

文章目录 题目解读你需要具备的知识点课题推荐视频分析 题目解读 主要做的是“大数据”与“人工智能”。 其中“大数据”所涉及的的第一个就是大量的数据,数据从哪里来?拿到数据后,我们需要做基本的数据分析,如何对大量的数据进…

Springboot2.7解决静态资源302问题

application.yml配置: spring: mvc: static-path-pattern: /static/** web: resources: static-locations: classpath:/static/ 配置后,静态资源是生效了。 但在页面上显示有些是200,有些是302,不同的状态, 觉得很…

华为OD机试真题-贪吃的猴子-2024年OD统一考试(C卷D卷)

题目描述: 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香蕉,每次都只能从行的开头或者末尾获取,并且只能获取N次,求猴子最多能获取多少根香蕉。 输入描述: 第一行为数组numbers的长度 第二…

Flink cdc如何只进行增量同步,不同步历史数据(只读取binlog)

环境 flink: 1.15.3 flink-connector-mysql-cdc: 2.4.0 场景: mysql cdc到starrocks, 目前线上环境以及有老的任务在同步,现在升级了任务(旧checkpoints无法使用)旧表里面数据特别大,不方便重新同步 方…

Window系统mysql数据库定时备份脚本

将下面的内容复制到bat文件里,然后将5个变量进行修改: mysqldumpPath 你本地mysql路径 dbName 需要备份的数据库 dbUser 数据库用户名 dbPwd 数据库密码 outpurDir 备份文件输出路径 echo 取日期、时间变量值 set yy%date:~0,4% set mm%date:~5,2% set …

Java8 Optional类使用总结

前言 相信不少小伙伴已经被java的NPE(NullPointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性 Opti…

聚道云一键打通金蝶宁波银行,财务效率暴涨10倍!

客户介绍: 某农资有限公司是一家集农资贸易、仓储物流、农机服务为一体的大型企业。随着业务规模的不断扩大,传统的手动财务操作模式已难以满足其需求。公司急需寻找一种方法,将金蝶财务软件与宁波银行对接,实现资金流转自动化和…