轻松创建对象——简单工厂模式(Java实现)

1. 引言

大家好,又见面了!在上一篇文章中,我们通过Python示例介绍了简单工厂模式,今天,我们继续深入这个话题,用Java来实现简单工厂模式。

2. 什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个工厂类,根据传入的参数决定创建哪一种产品类的实例。简单来说,简单工厂模式就是把创建对象的任务交给一个专门的工厂类,让工厂来决定生产哪种对象,咱们只需安心享用即可。

3. 简单工厂模式的实现(Java)

示例一:形状工厂

假如你是个艺术家,需要画各种形状,圆形、方形啥的,你可以用简单工厂模式让工厂帮你搞定这些形状对象:

代码实现
// 定义Shape接口
public interface Shape {void draw();
}// 实现Circle类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}// 实现Square类
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}// 实现ShapeFactory工厂类
public class ShapeFactory {public static Shape createShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}
}// 使用示例
public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();// 获取 Circle 对象并调用其 draw 方法Shape shape1 = shapeFactory.createShape("CIRCLE");shape1.draw();  // 输出: Drawing a Circle// 获取 Square 对象并调用其 draw 方法Shape shape2 = shapeFactory.createShape("SQUARE");shape2.draw();  // 输出: Drawing a Square}
}
详细代码解析
  • Shape是一个接口,定义了draw方法;
  • CircleSquare类实现了Shape接口,具体画啥样子它们说了算;
  • ShapeFactory类有一个静态方法createShape,根据传入的形状类型参数创建并返回对应的形状对象;
  • 我们只需通过调用ShapeFactory.createShape方法并传入形状类型,就能轻松得到相应的形状对象。
示例二:日志记录器工厂

现在你是个开发者,搞个日志系统,你想要不同级别的日志记录器来帮你分门别类记录信息,简单工厂模式也能派上用场:

代码实现
// 定义Logger接口
public interface Logger {void log(String message);
}// 实现InfoLogger类
public class InfoLogger implements Logger {@Overridepublic void log(String message) {System.out.println("INFO: " + message);}
}// 实现ErrorLogger类
public class ErrorLogger implements Logger {@Overridepublic void log(String message) {System.out.println("ERROR: " + message);}
}// 实现LoggerFactory工厂类
public class LoggerFactory {public static Logger createLogger(String loggerType) {if (loggerType == null) {return null;}if (loggerType.equalsIgnoreCase("INFO")) {return new InfoLogger();} else if (loggerType.equalsIgnoreCase("ERROR")) {return new ErrorLogger();}return null;}
}// 使用示例
public class FactoryPatternDemo {public static void main(String[] args) {LoggerFactory loggerFactory = new LoggerFactory();// 获取 InfoLogger 对象并调用其 log 方法Logger infoLogger = loggerFactory.createLogger("INFO");infoLogger.log("This is an informational message.");  // 输出: INFO: This is an informational message.// 获取 ErrorLogger 对象并调用其 log 方法Logger errorLogger = loggerFactory.createLogger("ERROR");errorLogger.log("This is an error message.");  // 输出: ERROR: This is an error message.}
}
详细代码解析
  • Logger是一个接口,定义了log方法;
  • InfoLoggerErrorLogger类实现了Logger接口,分别负责记录不同级别的日志;
  • LoggerFactory类的静态方法createLogger根据传入的日志类型参数创建并返回对应的日志记录器对象;
  • 你只需通过调用LoggerFactory.createLogger方法并传入日志类型参数,就能得到相应的日志记录器对象。

4. 简单工厂模式的应用场景和实例

示例三:数据库连接工厂

假如你现在是个DBA,需要管理多个数据库连接,简单工厂模式同样能帮你搞定这个问题:

代码实现
// 定义DatabaseConnection接口
public interface DatabaseConnection {void connect();
}// 实现MySQLConnection类
public class MySQLConnection implements DatabaseConnection {@Overridepublic void connect() {System.out.println("Connecting to MySQL database...");}
}// 实现PostgreSQLConnection类
public class PostgreSQLConnection implements DatabaseConnection {@Overridepublic void connect() {System.out.println("Connecting to PostgreSQL database...");}
}// 实现DatabaseConnectionFactory工厂类
public class DatabaseConnectionFactory {public static DatabaseConnection createConnection(String dbType) {if (dbType == null) {return null;}if (dbType.equalsIgnoreCase("MYSQL")) {return new MySQLConnection();} else if (dbType.equalsIgnoreCase("POSTGRESQL")) {return new PostgreSQLConnection();}return null;}
}// 使用示例
public class FactoryPatternDemo {public static void main(String[] args) {DatabaseConnectionFactory dbFactory = new DatabaseConnectionFactory();// 获取 MySQLConnection 对象并调用其 connect 方法DatabaseConnection mysqlConnection = dbFactory.createConnection("MYSQL");mysqlConnection.connect();  // 输出: Connecting to MySQL database...// 获取 PostgreSQLConnection 对象并调用其 connect 方法DatabaseConnection postgresqlConnection = dbFactory.createConnection("POSTGRESQL");postgresqlConnection.connect();  // 输出: Connecting to PostgreSQL database...}
}
详细代码解析
  • DatabaseConnection是一个接口,定义了connect方法;
  • MySQLConnectionPostgreSQLConnection类实现了DatabaseConnection接口,分别负责不同数据库的连接;
  • DatabaseConnectionFactory类的静态方法createConnection根据传入的数据库类型参数创建并返回对应的数据库连接对象;
  • 你只需通过调用DatabaseConnectionFactory.createConnection方法并传入数据库类型参数,就能得到相应的数据库连接对象。

5. 简单工厂模式的优缺点

优点
  • 解耦:把对象的创建过程封装在工厂类里,客户端代码只需关心怎么用,不用关心怎么创建;
  • 灵活性:通过工厂类可以灵活地创建不同类型的对象,扩展性杠杠的。
缺点
  • 违背开闭原则:每次新增对象类型,都得改工厂类,比较麻烦;
  • 单一职责问题:工厂类负责创建所有对象,复杂项目里可能会比较臃肿。

6.示意图(图片来源:https://xie.infoq.cn/article/270b6bbfd752d9906bf0a09df)

img

7. 总结

简单工厂模式就是这么神奇,它让对象的创建变得简单又高效,适用于各种需要灵活创建对象的场景。虽然它有一些缺点,但在大多数情况下,简单工厂模式依然是个非常实用的设计模式。希望今天的分享能让大家对简单工厂模式有更深入的理解,如果你在项目中也用到了简单工厂模式,欢迎留言分享你的经验和见解!
在这里插入图片描述

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

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

相关文章

视频融合共享平台视频共享融合赋能平台数字化升级医疗体系

在当前,医疗健康直接关系到国计民生,然而,由于医疗水平和资源分布不均,以及信息系统老化等问题,整体医疗服务能力和水平的提升受到了限制。视频融合云平台作为数字医疗发展的关键推动力量,在医疗领域的广泛…

计算机网络知识汇总

OSI七层模型 七层模型一般指开放系统互连参考模型,开放系统互连参考模型 (Open System Interconnect 简称OSI),OSI参考模型是具有7个层次的框架,自底向上的7个层次分别是物理层、数据链路层、网络层、传输层、会话层、…

省市县下拉框的逻辑以及多表联查的实例

2024.7.12 一. 省市县的逻辑开发。1、准备:1.1. 要求:1.2 数据库表: 2. 逻辑:3. 方法3.1 创建实体类3.2 数据访问层3.3 实现递归方法3.4 控制器实现3.5 前端处理 二、多表联查(给我干红温了)1. 出现了问题2…

python进阶(5):魔术方法篇(1)

之前使用的__init__ 构造方法,是Python类内置的方法之一。 这些内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法 1 __str__ 字符串方法 class Student:name Noneage Nonetel Nonedef __init__(self,name…

shell脚本之if/case语句

一、条件测试 1、1 返回码 $? $? :返回码,用来判断命令或者脚本是否执行成功。 0 :表示true ,成功;非0 则表示flase ,失败。 1、2 test命令 可以进行条件测试,然后根据返回值来判断条件是否成立 -e…

Redis基础教程(十五):Redis GEO地理信息查询与管理

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

怎么提高音频的播放速度?可以提高音频播放速度的四种方法推荐

怎么提高音频的播放速度?提高音频的播放速度是一种有效的策略,可以显著节省时间和提升信息获取的效率。随着信息量不断增加和学习需求的多样化,快速播放音频已成为许多人在日常生活和工作中的常见做法。这种方法不仅可以用于提高学习效率&…

Git-Unity项目版本管理

目录 准备GitHub新建项目并添加ssh密钥Unity文件夹 本文记录如何用git对unity 项目进行版本管理,并可传至GitHub远端。 准备 名称版本windows11Unity2202.3.9.f1gitN.A.githubN.A. GitHub新建项目并添加ssh密钥 GitHub新建一个repositorywindows11 生成ssh-key&…

全志A527 T527 android13支持usb摄像头

1.前言 我们发现usb摄像头在A527 android13上面并不能正常使用,需要支持相关的摄像头。 2.系统节点查看 我们查看系统是否有相关的节点生成,发现/dev/video相关的节点已经生成了。并没有问题,拔插正常。 3.这里我们需要查看系统层是否支持相关的相机, 我们使用命令进行…

详解yolov5的网络结构

转载自文章 网络结构图(简易版和详细版) 此图是博主的老师,杜老师的图 网络框架介绍 前言: YOLOv5是一种基于轻量级卷积神经网络(CNN)的目标检测算法,整体可以分为三个部分, ba…

警钟!电池储能安全事故频发!物联网技术如何加强储能安全排查?

在新能源时代背景下,储能系统作为能源转型的关键支撑技术,其安全问题日益凸显,尤其是近期海外电池项目连续发生的事故,为全球储能行业敲响了警钟。面对这一挑战,物联网技术以其强大的数据采集、智能分析与远程监控能力…

【计算机组成原理 | 第二篇】计算机硬件架构的发展

目录 前言: 冯诺依曼计算机架构 现代计算机架构: 总结: 前言: 在当今数字化时代,计算机硬件不仅是技术进步的见证者,更是推动这一进步的基石。它们构成了我们日常生活中不可或缺的数字生态系统的核心&a…

4. 小迪安全v2023笔记 javaEE应用

4. 小迪安全v2023笔记 javaEE应用 ​ 大体上跟随小迪安全的课程,本意是记录自己的学习历程,不能说是完全原创吧,大家可以关注一下小迪安全。 若有冒犯,麻烦私信移除。 默认有java基础。 文章目录 4. 小迪安全v2023笔记 javaEE应…

C++程序进阶学习

目录 引言 C内存分区 一、内存分区模型 二、 程序运行前 三、程序执行后 C引用 引用的语法 作用 本质 优点 C封装 C对象特性 C对象模型和this指针 C友元 C运算符重载 C继承 C多态 C文件 引言 看过我博客的朋友可能都了解这篇文章内容了,这篇博…

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一,使用逆向工程步骤梳理1,修改逆向工程的application.yml配置2,修改逆向工程的generator.properties配置3,以Debug模式启动逆向工程4,使用逆向工程生成代码5,整合生成的代码到对应的模块中 二&am…

FastAPI 学习之路(三十五)项目结构优化

之前我们创建的文件都是在一个目录中,但是在我们的实际开发中,肯定不能这样设计,那么我们去创建一个目录,叫models,大致如下。 主要目录是: __init__.py 是一个空文件,说明models是一个package…

2.GAP:通用访问协议

GAP的简单理解 GAP这个名字,直接翻译过来不好理解。 简单点可以理解为: 这是蓝牙设备在互联之前,过程中,第一个用于交流的协议。在代码上,会给这个协议实现,连接参数的设置,连接事件的实现&am…

maven高级1——一个项目拆成多个

把原来一个项目,拆成多个项目。 !!他们之间,靠接口通信。 以ssm整合好的项目为例: 如何看拆的ok不ok 只要compile通过就ok。 拆分pojo 先新建一个项目模块,再把内容复制进去。 拆分dao 1.和上面一样…

Unity之Text组件换行\n没有实现+动态中英互换

前因:文本中的换行 \n没有换行而是打印出来了,解决方式 因为unity会默认把\n替换成\\n 面板中使用富文本这个选项啊 没有用 m_text.text m_text.text.Replace("\\n", "\n"); ###动态中英文互译 using System.Collections; using…

牛客小白月赛98

骰子魔术 jackle 会拿出一枚骰子,骰子的表面分别写上了从 1∽5001\backsim 5001∽500 的数字,朋友会随便说一个 1∽5001\backsim 5001∽500 之间的点数,jackle 都能保证百分之百的掷出这个点数。 当然 jackle 有备而来,他准备了 …