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 {
    @Override
    public String getName() {
        return "绿豆沙";
    }
}

public class BlackSesamePaste implements Dessert {
    @Override
    public 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.mfbz.cn/a/573433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

像人脑一样工作!在量子计算机上运行强大的人工智能

内容来源:量子前哨(ID:Qforepost) 文丨王珩 浪味仙 排版丨沛贤 深度好文:2500字丨8分钟阅读 摘要:Transformer 确实可以在简单的量子硬件上工作,这至少从理论上表明:量子人工智能的…

库存数据可视化分析按这个做,赚大了!

今天我们来看一张库存数据可视化分析驾驶舱,全面了解库存资金占用情况,物料周转情况,库存趋势情况、以及占库存金额最高的商品有哪些等。 为更好地实现以上效果,并且增强报表的可读性、易读性,我们采用了按分析场景选…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

使用 pytorch训练自己的图片分类模型

如何自己训练一个图片分类模型,如果一切从头开始,对于一般公司或个人基本是难以实现的。其实,我们可以利用一个现有的图片分类模型,加上新的分类,这种方式叫做迁移学习,就是把现有的模式知识,转…

【智能算法】金豺优化算法(GJO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年,N Chopra等人受到金豺狩猎行为启发,提出了金豺优化算法(Golden Jackal Optimization, GJO)。 2.算法原理 2.1算法思想 GJO 模拟金豺协同狩猎…

20240425在Ubuntu20.04下检测HDD机械硬盘

20240425在Ubuntu20.04下检测HDD机械硬盘 2024/4/25 14:28 百度:免费 HDD 机械硬盘坏道检测 ubuntu HDD机械硬盘 坏道检测 https://blog.csdn.net/anny0001/article/details/136001767 ubuntu 坏道扫描 Mystery_zero 已于 2024-02-02 22:20:46 修改badblocks -b 819…

Exploiting CXL-based Memory for Distributed Deep Learning——论文泛读

ICPP 2022 Paper CXL论文阅读笔记整理 问题 深度学习(DL)正被广泛用于解决不同领域的科学应用中的复杂问题。DL应用程序使用大规模高性能计算(HPC)系统来训练给定的模型,需要消耗大量数据。这些工作负载具有很大的内…

k8s使用calico网络插件时,集群内节点防火墙策略配置方法

前言 我们在内网使用k8s时,有时候需要针对整个集群的节点设置防火墙,阻止一些外部访问,或者是仅允许白名单内的ip访问,传统做法是使用firewall之类的防火墙软件,但是,使用firewall存在如下问题&#xff1a…

Unity inputSystem 读取输入值的方法

1:通过关在 PlayerInput 获取 设置后之后在同意物体上挂载C# 脚本 通过事件获得 2: 生成 C#脚本 通过C# 脚本获得 3:通过回调函数

redis中的缓存穿透问题

缓存穿透 缓存穿透问题: 一般请求来到后端,都是先从缓存中查找数据,如果缓存中找不到,才会去数据库中查询数据。 而缓存穿透就是基于这一点,不断发送请求查询不存在的数据,从而使数据库压力过大&#xff…

python+vue得物文具玩具礼品商城系统flask-django

网站素材:收集好看的素材,然后使用PS做出适合网页尺寸的图片。在需求分析阶段以前期调研结果为基础,理解系统功能、性能、可靠性等要求,采用数据流图、实体联系图、状态转换图、数据字典等给出系统的逻辑模型。在设计阶段&#xf…

【静态分析】静态分析笔记07 - 指针分析基础

参考: 【课程笔记】南大软件分析课程7——指针分析基础(课时9/10) - 简书 -------------------------------------------------------------- 1. 指针分析规则 规则:采用推导形式,横线上面是条件,横线下…

【VTKExamples::Meshes】第十八期 OBBDicer

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例OBBDicer,并解析接口vtkOBBDicer,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. …

GaussDB轻量化运维管理工具介绍

前言 本期课程将从管理平台的架构出发,结合平台的实例管理、实例升级、容灾管理和监控告警的功能和操作介绍,全面覆盖日常运维操作,带您理解并熟练运用GaussDB运维平台完成运维工作。 一、GaussDB 运维管理平台简介 开放生态层 友好Web界面…

解决office2016专业增强版 “你的许可证并非正版,你可能是盗版软件的受害者“

问题描述:安装完office后,用kms已经激活成功,但是一直在上面显示“你的许可证不是正版,并且你可能是盗版软件的受害者,使用正版Office,避免干扰并保护你的文件安全。” 尝试过网上的各种方法都没用,后面发现是用的HEU …

分享:9.3版本无缝导入AVEVA PDMS高版本工程12.0,12.1,E3D

9.3版本可以无缝导入AVEVA PDMS的工程。 UKP3d导入AVEVA PDMS工程的方法 http://47.94.91.234/forum.php?modviewthread&tid163583&fromuid6 (出处: 优易软件-工厂设计软件专家) (从AVEVA PDMS导出时元件和等级的功能我们正做收尾工作,到时可以…

Kafka---总结篇

kafka架构 主要概念 broker: 存储消息的机器 控制器controller (1)使用zookeeper, 除了提供一般的broker功能之外,还负责选举分区首领。通过在zookeepr中创建一个名为 /controller的临时节点称为 controller。每个选出的contro…

百科词条创建要多久成功?

在互联网信息爆炸的时代,百科词条作为权威的知识分享平台,其重要性不言而喻。那么,创建一个百科词条需要多久才能成功呢?创建百科词条是一个相当需要有耐心的工作,接下来伯乐网络传媒就来给大家讲一讲。 一、影响百科词…

node-sass报错如何解决

npm install 安装的时候 报node-sass错误 这个一看就是node版本兼容性导致的问题 node-sass与node版本不匹配 下面是常见的node版本和对应的node-sass版本 解决办法 1.单独安装node-sass npm install node-sass9.0.0 还是报上面的错误!!!&a…

论文笔记:Leveraging Language Foundation Models for Human Mobility Forecasting

SIGSPATIAL 2022 1intro 语言模型POI客流量预测 2 方法 3 实验
最新文章