轻松创建对象——简单工厂模式(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.xdnf.cn/news/1474407.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

6、Redis系统-数据结构-04-Hash

四、哈希表(Hashtable) 哈希表是一种高效的键值对数据结构,通过散列函数将键映射到表中的位置,实现快速的插入、删除和查找操作。Redis 广泛使用哈希表来实现 Hash 对象和数据库的键值存储。以下将从结构设计、哈希冲突与链式哈希…

力扣考研经典题 反转链表

核心思想 头插法: 不断的将cur指针所指向的节点放到头节点之前,然后头节点指向cur节点,因为最后返回的是head.next 。 解题思路 1.如果头节点是空的,或者是只有一个节点,只需要返回head节点即可。 if (head null …

ELFK简介

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

下载linux的吐槽

本来这几天放假了,想下一个linux玩一玩 教程(我就是根据这个教程进行下载的,但是呢在进行修改BIOS 模式的 地方遇见了困难,也许是电脑修过的原因,我狂按F12 以及 FnF12都没有BIOS设置,只有一个让我选择用w…

吉时利KEITHLEY KI-488驱动和说明

吉时利KEITHLEY KI-488驱动和说明

HCIE之IPV6三大动态协议ISIS BGP (十五)

IPV6 1、三大动态路由协议ipv61.1、ISIS1.1.1、ISIS多拓扑实验(需要详细看下lsdb verbose)1.2、ISIS TLV简单总结 1.2、BGP 2、IPv6 隧道技术2.1、ipv6手工隧道2.1.1、ipv6 gre手工隧道2.1.1.1、 ipv6、ipv4基础配置(省略)2.1.1.2…

多语言版在线出租车预订完整源码+用户应用程序+管理员 Laravel 面板+ 司机应用程序最新版源码

源码带PHP后台客户端源码 Flutter 是 Google 开发的一款开源移动应用开发 SDK。它用于开发 Android 和 iOS 应用,也是为 Google Fuchsia 创建应用的主要方法。Flutter 小部件整合了所有关键的平台差异,例如滚动、导航、图标和字体,可在 iOS 和…

【Linux】进程的概念 + 查看进程

前言: 在前面我们学习了Liunx的基本指令和权限相关知识,还有基本工具的使用,有了以上的基础知识我们本章将正式接触Linux操作系统。 目录 1.冯诺依曼体系结构1.1 内存存在的意义1.2 程序加载到内存的含义1.3 程序的预加载: 2 .认识…

基于支持向量机、孤立森林和LSTM自编码器的机械状态异常检测(MATLAB R2021B)

异常检测通常是根据已有的观测数据建立正常行为模型,从而将不同机制下产生的远离正常行为的数据划分为异常类,进而实现对异常状态的检测。常用的异常检测方法主要有:统计方法、信息度量方法、谱映射方法、聚类方法、近邻方法和分类方法等。 …

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点2.2.四个点从0号…

中霖教育:环评工程师的薪资待遇怎么样?

【中霖教育怎么样】【中霖教育靠谱吗】 想要考环评工程师,但是不知道这个证书在行业内的发展前景是怎样的,中霖来为大家解答一下! 环评工程师,作为当前环境工程领域中非常重要的证书,薪资范围主要集中在4500-6000元之间。如果具…

Google RichHF-18K 文本到图像生成中的丰富人类反馈

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

viscode-插件

vue组件生成&#xff1a; vue.json {"Print to console": {"prefix": "vue", "body": ["<!-- $1 -->","<template>","<div>","</div>","</template>&q…

MSPM0G3507——OPENMV给M0传数据(用数据包)互相通信(以循迹为例)

OPENMV端代码 # main.py -- put your code here! import pyb, sensor, image, math, time from pyb import UART import ustruct from image import SEARCH_DS, SEARCH_EX import time import sensor, displayuart UART(3, 115200, bits8, parityNone, stop1, timeout_char10…

2024上半年网络工程师考试《应用技术》试题一

阅读以下说明&#xff0c;回答问题。 【说明】 MPLS基于(1)进行转发&#xff0c;进行MPLS标签交换和报文转发的网络设备称为(2)&#xff0c;构成MPLS域(MPSDomain)。位于MPLS域边缘、连接其他网络的LSR称为(3),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时&#xf…

计算云服务2

第二章 裸金属服务器 什么是裸金属服务器(BMS) 裸金属服务器(Bare Metal Server&#xff0c;BMS)是一款兼具虚拟机弹性和物理机性能的计算类服务为用户以及相关企业提供专属的云上物理服务器&#xff0c;为核心数据库、关键应用系统、高性能计算、大数据等业务提供卓越的计算…

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时&#xff0c;彩色图像通常由数百万个颜色值组成&#xff0c;每个颜色值都由红、绿、蓝三个分量组成。因此&#xff0c;如果我们直接对图像的每个像素进行编码&#xff0c;会导致非常大的数据量。为了减少数据量&#xff0c;我们可以尝试减少颜色…

ComfyUI预处理器ControlNet简单介绍与使用(附件工作流)

简介 ControlNet 是一个很强的插件&#xff0c;提供了很多种图片的控制方式&#xff0c;有的可以控制画面的结构&#xff0c;有的可以控制人物的姿势&#xff0c;还有的可以控制图片的画风&#xff0c;这对于提高AI绘画的质量特别有用。接下来就演示几种热门常用的控制方式 1…

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务16:数据采集/消费/存储

任务描述 “数据生产”的程序启动后&#xff0c;会持续向callLog.csv文件中写入模拟的通话记录。接下来&#xff0c;我们需要将这些实时的数据通过Flume采集到Kafka集群中&#xff0c;然后提供给HBase消费。Flume&#xff1a;是Cloudera提供的一个高可用的&#xff0c;高可靠的…

期末考试结束,老师该如何私发成绩?

随着期末考试的落幕&#xff0c;校园里又恢复了往日的宁静。然而&#xff0c;对于老师们来说&#xff0c;这并不意味着工作的结束&#xff0c;相反&#xff0c;一系列繁琐的任务才刚刚开始。 成绩单的发放&#xff0c;就是其中一项让人头疼的工作。家长们焦急地等待着孩子的考试…