Java设计模式 三 工厂方法模式 (Factory Method Pattern)

工厂方法模式 (Factory Method Pattern) 是一种常见的创建型设计模式,旨在通过定义一个接口来创建对象,而将实例化对象的具体类延迟到子类中。工厂方法模式允许客户端通过工厂方法来创建对象,而不需要直接调用构造函数,这样可以减少代码中的耦合度,并允许在不修改客户端代码的情况下更改对象的创建过程。

1. 工厂方法模式的结构

工厂方法模式的核心思想是将对象的创建与使用分开,定义一个工厂方法用于创建对象,并让子类实现这个工厂方法。

  • Product(产品接口):定义了产品的接口。
  • ConcreteProduct(具体产品):实现了 Product 接口,具体产品类。
  • Creator(创建者):声明了工厂方法,该方法返回一个 Product 对象。通常是抽象类或接口。
  • ConcreteCreator(具体创建者):实现了 Creator 类,并实现了工厂方法来返回具体的产品对象。

2. 工厂方法模式的优点

  • 扩展性强:增加新的具体产品类时,只需要添加新的 ConcreteProduct 类和新的 ConcreteCreator 子类,而不需要修改现有的客户端代码。
  • 解耦合:客户端不需要知道产品类的具体实现,只需依赖产品接口和工厂接口,可以降低类之间的耦合度。
  • 提高代码可维护性:如果产品的创建方式发生变化,只需要在工厂方法中进行修改,不会影响到客户端代码。

3. 工厂方法模式的缺点

  • 类的数量增加:为了每种产品提供一个工厂类,会导致系统中的类数量增加,可能使系统变得更复杂。
  • 灵活性差:如果需要创建大量不同类型的对象时,工厂方法模式的实现会比较冗长,维护成本高。

4. 工厂方法模式的实现

1) 定义产品接口

产品接口定义了不同类型产品的公共方法。

public interface Product {void doSomething();
}
2) 具体产品类

具体产品类实现了产品接口。

public class ConcreteProductA implements Product {@Overridepublic void doSomething() {System.out.println("ConcreteProductA doing something.");}
}public class ConcreteProductB implements Product {@Overridepublic void doSomething() {System.out.println("ConcreteProductB doing something.");}
}
3) 定义创建者接口

创建者接口声明了工厂方法,用来创建产品对象。

public abstract class Creator {public abstract Product factoryMethod();
}
4) 具体创建者类

具体创建者类实现了工厂方法,返回具体的产品实例。

public class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}public class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}
5) 客户端使用工厂方法

客户端只需要依赖于 Creator 类,而无需知道产品的具体实现。通过工厂方法来创建产品实例。

public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.factoryMethod();productA.doSomething();  // 输出: ConcreteProductA doing something.Creator creatorB = new ConcreteCreatorB();Product productB = creatorB.factoryMethod();productB.doSomething();  // 输出: ConcreteProductB doing something.}
}

5. 工厂方法模式的应用场景

  • 当一个类不知道它所需要的对象的具体类时。通过使用工厂方法,客户端可以依赖接口来获取对象,而无需关心具体的实现类。
  • 当类的实例化过程可能会发生变化时。如果产品的创建过程需要进行修改,工厂方法模式使得客户端不需要修改,只需修改工厂方法即可。
  • 需要通过子类来决定产品的具体类型时。子类可以通过重写工厂方法来创建不同的产品实例。

6. 工厂方法模式与简单工厂模式的比较

  • 简单工厂模式 (Simple Factory):通过一个静态方法来创建对象,客户端调用时直接提供产品类型(通常是枚举或字符串),而不需要依赖工厂接口和具体的工厂类。

    • 缺点:简单工厂模式会使得工厂方法与客户端耦合,产品类型的增加导致修改工厂方法,违反了“开闭原则”(对扩展开放,对修改封闭)。
  • 工厂方法模式:工厂方法模式定义了一个工厂接口,允许不同的工厂子类来创建不同的产品。相比于简单工厂,工厂方法模式更加灵活,符合“开闭原则”。

7. 总结

  • 工厂方法模式 适用于当你需要生成不同类型的产品时,并且希望通过工厂方法来解耦产品的创建与使用逻辑。
  • 它将对象的创建推迟到子类中,并通过工厂方法来返回具体的产品实例,减少了系统中类之间的耦合。
  • 当系统中的产品种类较多时,使用工厂方法模式能够方便地扩展和修改产品的实现,而不影响现有的客户端代码。

通过这种方式,工厂方法模式可以帮助你构建一个灵活且易于扩展的系统。

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

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

相关文章

docker环境搭建,docker拉取mysql,docker制作自定义C++镜像

目录 centos 安装和使用 dockerdocker拉取mysql使用可执行文件制作docker镜像Dockerfile文件优化Dockerfile简介Dockerfile优化 centos 安装和使用 docker yum install docker systemctl start docker systemctl status docker# 查询docker版本 docker version # 查询docker基…

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例&#xff1a; https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

在Docker 容器中安装 Oracle 19c

在 Docker 容器中安装 Oracle 19c 是可行的&#xff0c;但它相较于其他数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;会复杂一些&#xff0c;因为 Oracle 数据库有一些特定的要求&#xff0c;如操作系统和库的依赖&#xff0c;以及许可证问题。 不过&#xff0c;Ora…

macos的图标过大,这是因为有自己的设计规范

苹果官方链接&#xff1a;App 图标 | Apple Developer Documentation 这个在官方文档里有说明&#xff0c;并且提供了sketch 和 ps 的模板。 figma还提供了模板&#xff1a; Figma

告别手动编辑:如何用Python快速创建Ansible hosts文件?

在自动化运维领域&#xff0c;Ansible是一款非常强大的工具&#xff0c;它可以帮助我们管理和配置大量的服务器。为了让Ansible能够有效地管理这些服务器&#xff0c;我们需要一个hosts清单文件&#xff0c;该文件定义了Ansible要管理的目标主机。在实际应用中&#xff0c;我们…

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…

【嵌入式】总结——Linux驱动开发(三)

鸽了半年&#xff0c;几乎全忘了&#xff0c;幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的&#xff0c;本篇与前两篇一样&#xff0c;重点在于使用、快速体验&#xff0c;uboot、linux、根文件系统不作深入理解&#xff0c;能用就行。 重新梳理一下脉络&#xff0c;本…

【29】Word:李楠-学术期刊❗

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…

ThinkPHP 8请求处理-获取请求对象与请求上下文

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用Composer初始化ThinkPHP 8应用_thinkphp8 compos…

某书x-s 、x-t 算法 python纯算56版本

文章目录 声明iv的获取key的获取python 算法还原声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! xhs xs自从2023年5月31号更新之后直到2024年7月之前好像就没有再怎么更新了 但是7月之…

【记录自开发的SQL工具】工具字符拼接、Excel转sql、生成编码、生成测试数据

记录自己开发的一个SQL聚合工具 功能介绍&#xff1a; 文本加引号 给多行文本前后添加引号&#xff0c;并用逗号连接&#xff0c;直接复制到 sql 中的 in 条件中 Excel转SQL 适用于将Excel表格的数据&#xff0c;批量导入到数据库的场景 此工具能快速将excel表格转换为i…

Linux安装mysql5.7

CentOS7安装MySQL&#xff08;完整版&#xff09; - oldmonk - 博客园 下载|安装 下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm使用上面的命令就直接下载了安装用的Yum Repository&#xff0c;大…

汽车定速巡航

配备定速巡航功能的车型&#xff0c;一般在方向盘附近设有4~6个按键&#xff08;可能共用键位&#xff09;。 要设置定速巡航&#xff0c;不仅需要方向盘上的按键&#xff0c;还要油门配合。 设置的一般流程&#xff1a; 开关&#xff1a;类似步枪上的“保险”&#xff0c;按…

Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

Python 轻松扫描&#xff0c;快速检测&#xff1a;高效IP网段扫描工具全解析 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…

利用 SAM2 模型探测卫星图像中的农田边界

将 Segment Anything Model Version 2 应用于卫星图像以检测和导出农业地区田地边界的分步教程 &#x1f31f; 简介 手动绘制田地边界是最耗时的任务之一&#xff0c;其准确性取决于绘制者的表现。然而&#xff0c;精确的边界检测在很多领域都有应用。例如&#xff0c;假设您…

初步搭建并使用Scrapy框架

目录 目标 版本 实战 搭建框架 获取图片链接、书名、价格 通过管道下载数据 通过多条管道下载数据 下载多页数据 目标 掌握Scrapy框架的搭建及使用&#xff0c;本文以爬取当当网魔幻小说为案例做演示。 版本 Scrapy 2.12.0 实战 搭建框架 第一步&#xff1a;在D:\pyt…

人脸识别打卡系统--基于QT(附源码)

逃离舒适区 项目源代码放在我的仓库中&#xff0c;有需要自取 项目地址 https://gitcode.com/hujiahangdewa/Face_recognition.git 文章目录 一、项目结构分析二、服务器的搭建三、客户端的搭建四、人脸识别库的申请五、基于人脸识别库的识别判断六、QT人脸识别----调用百度ai…