全网最简单的Java设计模式【三】工厂方法模式详解

Java工厂方法模式详解

一、概念介绍

1. 什么是工厂方法模式?

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它允许定义一个接口或抽象类来创建对象,但将实际对象的实例化延迟到子类中实现。工厂方法模式通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现对象的创建与使用分离,提高系统的灵活性和可扩展性。

2. 角色组成

工厂方法模式主要由以下四个角色组成:

1)抽象工厂(Creator):声明一个用于创建对象的工厂方法,该方法是一个抽象方法,由子类实现。

2)具体工厂(Concrete Creator):实现了抽象工厂接口,含有与应用相关的逻辑,用于创建具体的产品对象。

3)抽象产品(Product):定义了产品的接口,是工厂方法所创建对象的超类型,即工厂方法返回的对象类型。

4)具体产品(Concrete Product):实现了抽象产品接口的具体类,是被具体工厂创建的对象。

3. 特点

  • 延迟实例化:将对象的实例化延迟到子类中实现。
  • 符合开闭原则:新增产品时,只需新增相应的具体工厂类,无需修改原有代码。
  • 降低耦合:客户端只依赖于抽象工厂接口和产品接口,降低了客户端与具体产品的耦合度。

二、使用场景与优缺点

1. 使用场景

工厂方法模式适用于以下场景:

  • 需要创建的对象类型在编译时不确定:例如,根据不同的配置或输入参数创建不同类型的对象。
  • 系统需要扩展,且不希望修改现有代码:新增产品时,只需新增具体工厂类,无需修改现有代码。
  • 创建对象的过程复杂,且需要隐藏具体创建逻辑:将对象的创建过程封装在工厂类中,客户端无需关心创建细节。

2. 优点

  • 良好的封装性:隐藏了对象创建的细节,客户端只需通过接口操作对象。
  • 优秀的可扩展性:新增产品时,只需新增具体工厂类,符合开闭原则。
  • 降低耦合度:客户端只依赖于抽象接口,降低了与具体实现的耦合。

3. 缺点

  • 类的数量增加:针对每一种产品都需要定义一个具体工厂类,随着产品种类的增加,类的数量也相应增加。
  • 产品族扩展困难:当需要新增产品族时,可能需要修改多个具体工厂类,影响系统的扩展性。

三、Java实现示例

以下是一个使用Java实现的工厂方法模式示例,模拟了一个简单的汽车制造场景。

1. 抽象产品接口(Car)

下面是一个抽象产品接口,它定义了产品对象的公共接口。在这个例子中,Car接口有一个run方法,用于描述汽车运行的行为。


public interface Car {
	void run();
}

2. 具体产品实现类

BenzBMW是实现了Car接口的具体产品类。它们分别提供了run方法的具体实现,用于描述不同品牌汽车的运行行为。

public class Benz implements Car {

	@Override
	public void run() {
		
		System.out.println("Benz is running.");  
	}

}
public class BMW implements Car {

	@Override
	public void run() {
		
		System.out.println("BMW is running.");
	}

}

3. 抽象工厂接口(CarFactory)

下面是一个抽象工厂接口,它声明了工厂方法createCar,该方法返回一个Car类型的对象。抽象工厂接口是工厂方法模式的核心,它允许系统在不直接指定具体产品类的情况下创建对象。

public interface CarFactory {
	
	Car createCar(); 
}

4. 具体工厂类

BenzFactoryBMWFactory 是实现了 CarFactory 接口的具体工厂类。它们分别重写了 createCar 方法,用于创建并返回具体的产品对象(BenzBMW)。

public class BenzFactory implements CarFactory {

	@Override
	public Car createCar() {
		return new Benz();
	}

}
public class BMWFactory implements CarFactory {

	@Override
	public Car createCar() {
		return new BMW();
	}

}

5. 客户端

客户端通过工厂类来创建产品对象,而不是直接通过new关键字。这种方式使得客户端代码与具体产品类的实现解耦,提高了系统的灵活性和可扩展性。当需要添加新的产品类时,只需添加相应的具体产品类和具体工厂类,而无需修改客户端代码。

public class Client {

	public static void main(String[] args) {
		
		CarFactory benzFactory = new BenzFactory();  
        Car benz = benzFactory.createCar();  
        benz.run();  
  
        CarFactory bmwFactory = new BMWFactory();  
        Car bmw = bmwFactory.createCar();  
        bmw.run();  
	}

}

运行结果:

Benz is running.
BMW is running.

结束语

工厂方法设计模式通过引入工厂等级结构,允许系统在不直接指定具体产品类的情况下创建对象。它通过将对象的创建过程封装在工厂类中,使得客户端代码与具体产品类的实现解耦,提高了系统的灵活性和可扩展性。同时,它也遵循了开闭原则,即软件实体应该对扩展开放,对修改关闭。但也存在类数量增加和产品族扩展困难等缺点。

在实际应用中,应根据具体需求选择合适的设计模式,以提高代码的可维护性和可扩展性。通过工厂方法模式,Java开发者可以更灵活地管理对象的创建过程,从而编写出更加健壮和易于维护的代码。

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

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

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

相关文章

HTML内容爬取:使用Objective-C进行网页数据提取

网页爬取简介 网页爬取,通常被称为网络爬虫或爬虫,是一种自动浏览网页并提取所需数据的技术。这些数据可以是文本、图片、链接或任何网页上的元素。爬虫通常遵循一定的规则,访问网页,解析页面内容,并存储所需信息。 …

自动化立体仓库出入库能力及堆垛机节拍

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载 自动化立体仓库的出入库能力、堆垛机节拍以…

用720云搭建数字孪生VR智慧安防系统,赋能安防升级!

“安全防范"一直是我国城镇化发展进程中重点关注的工作板块,随着时代发展需求与科技的日新月异,安防行业正在积极融合VR3D数字孪生技术,升级安防数字基础设施和安防产品服务创新。 今年2月,《数字中国建设整体布局规划》的出…

Pycharm的终端(Terminal)中切换到当前项目所在的虚拟环境

1.在Pycharm最下端点击终端/Terminal, 2.点击终端窗口最上端最右边的∨, 3.点击Command Prompt,切换环境, 可以看到现在环境已经由默认的PS(Window PowerShell)切换为项目所使用的虚拟环境。 4.更近一步,如果想让Pycharm默认显示…

macOS使用Karabiner-Elements解决罗技鼠标G304连击、单击变双击的故障

记录一下罗技鼠标G304单击变双击的软件解决过程和方案(适用于macOS, 如果是Windows,使用AutoHotKey也有类似解决办法、方案,改日提供): 背景:通过罗技Logitech G HUB软件对罗技的游戏鼠标侧键b…

1-4 NLP发展历史与我的工作感悟

1-4 NLP发展历史与我的工作感悟 主目录点这里 第一个重要节点:word2vec词嵌入 能够将无限的词句表示为有限的词向量空间,而且运算比较快,使得文本与文本间的运算有了可能。 第二个重要节点:Transformer和bert 为预训练语言模型发…

2024 世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海举办,推动智能向善造福全人类

2024 年 7 月 4 日,2024 世界人工智能大会暨人工智能全球治理高级别会议-全体会议在上海世博中心举办。联合国以及各国政府代表、专业国际组织代表,全球知名专家、企业家、投资家 1000 余人参加了本次会议,围绕“以共商促共享,以善…

搜维尔科技:如何使用 SenseGlove Nova 加速手部运动功能的恢复

District XR 的VR 培训 5 年多来,District XR 一直在为最大的工业公司创建 VR 和 AR 项目。 客户:District XR 客户代表:尼古拉沃尔科夫 他的角色:District XR 首席执行官 面临解决的挑战 该公司正在寻找一种方法来加速身体伤…

JavaScript——while类型

目录 任务描述 相关知识 while类型 编程要求 任务描述 质数的定义如下:大于1的自然数,且除了1和本身外没有别的因数。如2、3、5、7。 本关任务:利用循环结构求质数的和。 相关知识 在选择结构中,条件会被测试一次&#xff…

JAVA进阶学习10

文章目录 一、创建不可变集合二、Stream流2.1 Stream流的获取2.1 Stream流的中间方法2.2 Stream流的终结方法 一、创建不可变集合 意义:如果一个集合中的数据在复制或使用过程中不能修改,或者被其他对象调用时不能改变内部数据,即增加数据的安…

【靶机实战】Apache Log4j2命令执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验:极核靶场 -> 漏洞复现靶场 -> Log4j2-RCE 原文:【靶机实战】Apache Log4j2命令执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 Apache Log4j2 是一个广泛使用的 Java 日志记录库&#…

C++初学者指南-4.诊断---基础:警告和测试

C初学者指南-4.诊断—基础知识:警告和测试 文章目录 C初学者指南-4.诊断---基础知识:警告和测试1. 术语和技术记住:使用专用类型! 2.编译器警告Gcc/CLang 编译器选项MS Visual Studio 编译器选项 3.断言运行时断言静态断言&#x…

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机:主机是计算机的核心部分,包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算;控制器负责协调和控制计算机的各个部件;主存…

react+ts+antd项目搭建

前言: 基于ts语言创建react项目,node版本是v16.14.2 一、 脚手架创建项目 全局安装 npm install -g creacte-react-app创建项目file-management,ts需要添加–template typescript npx create-react-app file-management --template typesc…

如何搭建10万个H100 GPU的集群:电力、并行化、网络拓扑与成本优化

引言 在现代人工智能的发展中,构建大规模GPU集群是提升计算能力的关键手段。今天我们探讨如何搭建一个包含10万个H100 GPU的集群。这个项目不仅涉及巨大的资本支出,还面临电力供应、并行化处理、网络拓扑结构以及可靠性和恢复等多方面的挑战。通过深入分…

天命奇御下载

解压码/安装码 615634 天翼:https://cloud.189.cn/t/qAjmAnIB3eIv 链接: https://pan.baidu.com/s/1rArV_Q_pB-9U4kEDtWf_gQ 提取码: igaq 天命奇御/官方中文/整合V.2.3DLC伏虎迷蹤/完美学习版下载地址: 点击下载 原始地址:https://www.aiwanba.net/post…

在RT-Thread-Studio中添加arm_math库

1.在CMSIS\Lib\GCC中找到对应的库,如本文使用的libarm_cortexM4lf_math.a。将库拷贝到工程,并做如下图设置。搜索路径为库文件在项目中的实际位置。 2.将CMSIS\DSP\Include下的文件复制到工程目录中,并添加包含路径 3.添加宏定义&#xff0c…

APP自动更换包名和签名系统源码

APP自动更换包名和签名系统源码 系统通过对apk反编译,随机包名,随机签名,混淆代码等方式,回编译生成新的apk安装包通过系统智能自动处理,间隔5分钟(可以自定义时间)生成一个新包,通…

算法思想总结:优先级队列

一、最后一块石头的重量 . - 力扣(LeetCode) 我们每次都要快速找到前两个最大的石头进行抵消,这个时候用优先级队列(建大堆),不断取堆顶元素是最好的!每次删除堆顶元素后,可以自动调整&#xf…