【超简单-Java设计模式2】简单工厂模式

简单工厂设计模式:概念、Java实现与应用剖析

简单工厂模式,作为设计模式中最直观、易懂的一种,被广泛应用于软件开发中,尤其在需要创建一系列相关或相互依赖对象的场景下。本文将深入探讨简单工厂模式的概念,通过Java代码示例展示其实现,并分析其在实际开发中的使用场景与优缺点。

一、概念介绍

1. 简单工厂模式定义

简单工厂模式属于创建型模式的一种,其核心思想是定义一个用于创建对象的接口,让子类决定实例化哪一个类。简单工厂模式中,这个“工厂”通常是一个静态方法或一个类,它负责根据传入的参数,返回一个实现特定接口或抽象类的实例。这种方式将实例化逻辑集中在一个地方,便于维护和扩展。

2. 关键角色

  • 工厂类(Factory):负责根据传入的参数创建并返回相应的对象。
  • 抽象产品(Product):定义了所有产品类的公共接口或抽象类。
  • 具体产品(Concrete Product):实现了抽象产品的接口或继承了抽象产品类,是工厂类创建的对象。

二、简单工厂模式的Java代码示例

假设我们正在设计一个图形绘制系统,其中包含多种图形(如圆形、矩形等)。我们将使用简单工厂模式来创建这些图形。

1. 定义抽象产品接口

public interface Shape {
    void draw();
}

2. 创建具体产品类

1)创建一个圆形类:

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
}

2)创建一个矩形类:

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }
}

3. 创建工厂类

public class ShapeFactory {
    public static Shape getShape(String shapeType){
        if(shapeType == null){
            return null;
        }        
        if(shapeType.equalsIgnoreCase("CIRCLE")){
        	//调用圆形类,创建一个圆形
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
        	//调用矩形类,创建一个矩形
            return new Rectangle();
        }
        return null;
    }
}

4. 客户端代码

public class Client {
    public static void main(String[] args) {
    	//使用简单工厂创建圆形
        Shape circle = ShapeFactory.getShape("CIRCLE");
        circle.draw();
		//使用简单工厂创建矩形 
        Shape rectangle = ShapeFactory.getShape("RECTANGLE");
        rectangle.draw();
    }
}

三、简单工厂模式的使用场景

1.产品等级结构简单

当你需要创建的产品等级结构比较简单,即不存在太多产品子类时,简单工厂模式可以很好地发挥作用。这是因为简单工厂模式的核心就是通过一个静态工厂方法来根据传入的参数创建相应的对象实例,如果产品种类过多,工厂类就会变得非常庞大和复杂。

2. 客户端只需使用产品接口

简单工厂模式的一个关键点是客户端代码只需要知道产品接口或抽象类,而不需要知道具体的产品类是如何实现的。这使得客户端代码与产品类的耦合度大大降低。

3. 系统需要动态决定实例化哪个类

当系统在运行时需要根据某种条件或信息来决定创建哪个具体产品类的实例时,简单工厂模式是一个很好的选择。例如,一个系统可能需要根据用户的选择或配置信息来创建不同的数据库连接对象。

4. 创建对象的逻辑较为简单

如果创建对象的逻辑较为简单,没有涉及到复杂的业务逻辑,使用简单工厂模式可以简化代码结构,避免在客户端代码中出现大量的条件判断语句。

5. 系统初期产品数量不多,后期可能扩展

在系统设计初期,如果产品种类不多,但预期将来可能需要添加新的产品种类,可以先使用简单工厂模式。当需要添加新产品时,只需修改工厂类即可,而无需修改客户端代码。

6. 封装创建对象的逻辑

简单工厂模式可以将创建对象的逻辑封装在工厂类中,这样客户端代码就不需要关心对象的创建过程,提高了代码的可读性和可维护性。

四、简单工厂模式的优缺点

【优点】

1. 封装性好:

简单工厂模式将对象的创建和使用分离,客户端代码无需关心具体的创建逻辑,只需要调用工厂类的静态方法即可得到需要的对象。

2. 提高灵活性:

客户端代码只依赖于产品接口,而不需要知道具体的实现类,这使得系统更加灵活,易于扩展和维护。

3. 降低耦合度:

客户端与具体产品类解耦,只需要知道产品接口,这降低了系统的耦合度,提高了系统的可维护性和可扩展性。

4. 易于扩展:

当需要增加新的产品类时,只需修改工厂类的实现,客户端代码无需变动,符合“开闭原则”。

【缺点】

1. 工厂类过于集中:

所有产品的创建逻辑都集中在工厂类中,这会导致工厂类变得庞大和复杂,难以维护。尤其是当产品种类很多时,工厂类的代码会变得非常臃肿。

2. 违反开闭原则:

虽然简单工厂模式在客户端代码上实现了开闭原则,但是工厂类本身并不遵循开闭原则。当系统需要新增产品时,不得不修改工厂类的代码,增加了代码的复杂性和维护成本。

3. 工厂类的职责过重:

工厂类承担了所有的产品创建逻辑,这违背了“单一职责原则”。如果工厂类出错,可能会影响到整个系统。

4. 不适应复杂等级结构:

当产品等级结构较为复杂时,简单工厂模式可能无法很好地处理。例如,当产品存在多个等级结构时,简单工厂模式就需要在工厂类中做复杂的判断逻辑,这会增加代码的复杂度。

总结

简单工厂模式适用于产品种类较少且相对固定的情况,它可以简化客户端代码,提高系统的可维护性和可扩展性。但在产品种类较多或产品结构复杂时,应考虑使用更复杂的设计模式,如 工厂方法 模式或 抽象工厂 模式,以避免工厂类的职责过重和代码过于复杂。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。

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

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

相关文章

Kafka-服务端-副本同步-源码流程

杂 在0.9.0.0之前,Kafka提供了replica lag.max.messages 来控制follower副本最多落后leader副本的消息数量,follower 相对于leader 落后当超过这个数量的时候就判定该follower是失效的,就会踢出ISR,这里的指的是具体的LEO值。 对…

Hadoop权威指南-读书笔记-01-初识Hadoop

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips: 这个引例很有哲理嘻嘻😄,道出了分布式的灵魂。 1.1 数据!数据! 这一小节主要介绍了进入大数据时代,面…

【windows|012】光猫、路由器、交换机详解

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 ​ 🏅阿里云ACE认证高级工程师 ​ 🏅阿里云开发者社区专家博主 💊交流社…

QML学习——Qt Quick Extras Examples 1.4(八)

Qt Quick Extras Examples 阅读官方的源码然后尝试做了下 01 A car dashboard 样例演示: 说明: ValueSource组件控制数值相关的动画,例如图中数值的变化;TurnIndicator组件是控制左右方向灯的闪烁和背景,里面使用…

excel修改批量一列单价的金额并保留1位小数

1.打开表格,要把单价金额变成现在的两倍,数据如下: 2.把单价这一列粘贴到一个新的sheet页面,在B2单元格输入公式:A2*2 然后按enter回车键,这时候吧鼠标放到B2单元格右下角,会出现一个黑色的小加号&#xf…

SQL 注入联合查询之为什么要 and 1=2

在 SQL 注入联合查询中,将 id 先置为假(如 id-1 或其他使查询结果为空的条件),通常是为了让前面的查询语句查询不到结果,从而使联合查询中后面的语句结果能够显示在回显位上

【深度学习】pytorch训练中的一个大坑

使用的命令:iostat -x 5 可以看到 ssd的利用率已经满了。 之前在的数据集放在了 hdd上,训练结果特别慢。 所以我把它移动到了ssd上,然后训练参数用的 resume, 但是!!!!它把历史记住…

虚拟环境管理

虚拟环境 在使用 Python 时我们一般使用“pip install 第三方包名”来安装第三方包,但是由于pip的特性,系统只能安装每个包的一个版本。而在实际开发中,可能同时开发多个项目,如:上图有三个项目;每个项目需…

摄影后期色彩管理流程(Lightroom篇)

在摄影后期处理中,色彩管理是确保图像从捕捉到输出的一致性和准确性的关键。Lightroom 和 Photoshop 其实已经将这套色彩管理流程作为默认选项,如果实质操作时仍存在色彩偏差的问题,可参考以下内容。 ProPhoto RGB > Adobe RGB > sRGB …

幻兽帕鲁服务器如何安装模组安装

由于模组多数为Window版本的,所以本教程以服务端为Window的作为演示(Linux服务端的也是一样的操作)百度莱卡云开服 如果你你是Linux版本的,请点击跳转切换服务端教程 接下来是本地安装模组包的方法(服务器自带&#xf…

Web3 游戏周报(6.23 - 6.29)

区块链游戏热度不减,你是否掌握了上周的重要动态? 回顾上周区块链游戏动态,查看 Footprint Analytics 与 ABGA 的最新数据报告。 【6.23 - 6.29】Web3 游戏行业动态: 继 Notcoin 之后,另一款 Telegram 游戏 Hamster …

React实战学习(一)_棋盘设计

需求: 左上侧:状态左下侧:棋盘,保证胜利就结束 和 下过来的不能在下右侧:“时光机”,保证可以回顾,索引 语法: 父子之间属性传递(props)子父组件传递(写法上&…

【MySQL篇】Percona XtraBackup物理备份工具的基础理论概述(第一篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

​产品经理-困惑4:产品面对开发是否低人一等(4)

在互联网当中,做产品的,在面对开发是否觉得低人一等? 完全不会 从团队层面来看,任何互联网团队都是由开发、产品、视觉、运营、市场等专业人才所组成的专业团队 每人各有专攻,为同一个目标(即项目成功)而不懈努力。各工…

带安全启动—Ubuntu系统—手动安装Nvidia驱动

教程1:在启用安全启动的 Fedora 中安装英伟达驱动 教程2:UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动 1. 搜索合适的驱动 Nvidia驱动官网 选择这个 驱动(.run)链接 2. 安装必要的软件依赖 CUDA底层用C写的,因此导入编译器 sudo apt i…

1-4.时间序列数据建模流程范例

文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…

已解决java.io.NotSerializableException:对象不支持序列化的正确解决方法,亲测有效!!!

已解决java.io.NotSerializableException:对象不支持序列化的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 示例代码 报错原因 解决思路 解决方法 1. 实现Serializable接口 修改后的Employee类 2…

递归----计算P函数

注意运算中的符号不能少&#xff01;&#xff01;&#xff01;&#xff01; * 必须体现出&#xff01;&#xff01;&#xff01;&#xff01; #include <stdio.h>double P( int n, double x );int main() {int n;double x;scanf("%d %lf", &n, &x);pri…

计算机毕业设计Python+Spark股票基金推荐与预测系统 股票基金可视化 股票基金推荐系统 股票基金可视化系统 股票基金数据分析 股票基金爬虫大数据

目 录 摘 要 Abstract 第1章 前 言 1.1 项目的背景和意义 1.2 研究现状 1.3 项目的目标和范围 1.4 论文结构简介 第2章 技术与原理 2.1 开发原理 2.2 开发工具 2.3 关键技术 第3章 需求建模 3.1 系统可行性分析 3.2 功能需求分析 3.3 非功能性…

opengl箱子的显示

VS环境配置&#xff1a; /JMC /ifcOutput "Debug\" /GS /analyze- /W3 /Zc:wchar_t /I"D:\Template\glfwtemplate\glfwtemplate\assimp" /I"D:\Template\glfwtemplate\glfwtemplate\glm" /I"D:\Template\glfwtemplate\glfwtemplate\LearnOp…