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

server/2024/9/18 12:45:26/ 标签: java, 设计模式, 简单工厂模式

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

一、简单工厂模式的结构

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

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

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

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

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

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

三、Java示例

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

java">// 抽象产品(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.ppmy.cn/server/10013.html

相关文章

.net core8 自定义一个中间件

在.NET Core 8中自定义一个中间件,基本步骤与之前的.NET Core版本相似。中间件是ASP.NET Core请求处理管道的一个组件,它们可以在请求处理过程中被调用。下面是如何创建和使用一个自定义中间件的步骤: 第一步:创建中间件类 创建…

ThingsBoard教程(二十九):详细讲解在tb平台下 http协议下的客户端rpc,服务的rpc的使用

客户端rpc 先来说一下简单的客户端rpc, 客户端发起rpc请求,只需要使用post方法调用该接口即可以 http://host:port/api/v1/$ACCESS_TOKEN/rpc请求路径中间的参数 ACCESS_TOKEN 必须是设备的访问令牌。 请求携带的参数如下,二个参数method和params {"method": …

WEB攻防-ASP安全-MDB下载

MDB下载漏洞主要涉及到早期ASPAccess构架的数据库文件。当Web站点提供文件下载功能时,如果没有对下载请求进行充分的验证和过滤,或者服务器配置不当,就可能产生文件下载漏洞。攻击者可以利用这个漏洞,通过修改请求参数或尝试猜测或…

设计模式|原型模式(Prototype Pattern)

文章目录 什么是原型模式结构优缺点优点缺点举例代码示例原型模式vs复制(copy)什么是原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而无需显式地指定它们的类。这种模式通常用于当对象的创建成本较高,或者对象…

基于微信小程序的宠物寄养小程序,附源码

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

邂逅JavaScript逆向爬虫-------基础语法篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

UniApp 中的路由魔法:玩转页面导航与跳转

正文: 路由在移动应用开发中是一个至关重要的概念,它决定了用户在应用中导航的方式,以及页面之间的跳转和传参方式。在 UniApp 中,路由配置也有其独特的特点和用法。本文将深入探讨 UniApp 中的路由配置,带你领略其中…

40+ Node.js 常见面试问题 [2024]

今天就开始你的Node.js生涯。在这里,我们探讨了最佳Node.js面试问题和答案,以帮助应届生和经验丰富的候选人获得理想的工作。 Node.js 是许多大公司技术堆栈的重要组成部分,例如 PayPal、Trello、沃尔玛和 NASA。 根据 ZipRecruiter 的数据&…

【k8s】(六)kubernetes1.29.4离线部署之-加入Node节点

备注: 完整版请参阅 【k8s】Kubernetes 1.29.4离线安装部署(总) 加入Node节点 根据执行命令生成第一个控制平面的结果,拷贝如下类似的文件到node节点。直接执行: kubeadm join x.x.x.x:6443 --token picxyk.su53y03l…

Golang专题精进

Golang专题精进 Golang单元测试Golang错误处理Golang正则表达式Golang反射Golang验证码Golang日期时间处理库CarbonGolang发送邮件库emailGolang log日志Golang log日志框架logrusGolang加密和解密应用Golang访问权限控制框架casbinGolang使用swagger生成api接口文档Golang jw…

视频转换器 AnyMP4 Video Converter Ultimate v8.5.52 x64

AnyMP4 Video Converter Ultimate 是一款功能强大的DVD转换器,使用可将DVD电影翻录为MP4,AVI,WMV,MOV,MKV,FLV,MP3等,支持将DVD转换为各种视频和音频,如TS,MP…

SQL CASE 语句

在SQL中的 CASE 语句是一种条件表达式,它允许你在查询中根据条件逻辑返回不同的值。CASE 语句通常有两种形式:简单 CASE 表达式和搜索 CASE 表达式。在我之前给出的优化SQL查询的例子中,使用了简单 CASE 表达式。 这里是简单 CASE 表达式的基…

自动驾驶控制算法

本文内容来源是B站——忠厚老实的老王,侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦,将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念: 运动学方程 建立微分方程 主要是弄…

【前后端】django前后端交互

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、django是什么二、django前后端交互指引三、总结 前言 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一些开发语言&#x…

冯喜运:4.22外汇黄金原油趋势分析及操作建议

【黄金消息面解析 】:周一(4月22日)亚市,现货黄金震荡下跌,最低触及2361.98美元/盎司,较上周五收盘价下跌近30美元,因市场对中东冲突升级的担忧情绪降温,而美国国债收益率走高给美元计价的黄金带来压力。美…

level2行情+在线金融数据库

jvQuant:一站式金融量化服务平台 jvQuant作为一个领先的金融量化服务平台,为广大投资者和量化分析师提供了全面、高效、稳定的数据接入和量化分析服务。该平台涵盖了多个关键功能,包括交易接入、WebSocket行情接入、历史行情查询、在线数据库…

面:go能不能手写一个简单的协程池?

最简单的想法是使用chan管道和wg也就是sync.WaitGroup这两个搭档来进行实现协程池 那么在chan管道中最简单的就是无缓冲的了 对于协程池有啥操作? 第一个要想到newPool 并且要明白,这个协程池是不是你叫他停他才能停,如果没说&#xff0c…

微信小程序地图polyline坐标太多异常显示BUG

描述 微信小程序map地图上显示polyline线,点位超过1250个出现bug,(仅真机上出现,模拟器上正常) 这里以加载四川省边界为例, 以下是示例代码 // 读取geojson数据 uni.request({url: https://geo.datav.aliyun.com/a…

PyCharm添加外部工具

QtDesigner 可视化UI设计客户端工具 路径:File | Settings | Tools | External Tools点号,给External Tools组添加一个条目,填写如下内容 Name:QtDesignerProgram:C:\Users\用户名\AppData\Local\Programs\Python\Py…

深入了解直播美颜工具与视频美颜SDK的实现与优化策略

今天,小编将为大家详解视频美颜SDK技术的视线方案与优化策略。 一、美颜工具的实现原理 利用特征提取算法提取人脸的各种特征,如皮肤色调、眼睛大小等。接下来,根据用户设定的美颜参数,对提取的特征进行修改。最后,将…