12 设计模式之工厂方法模式

news2024/12/26 19:03:26

一、什么是工厂方法模式?

1.定义

        在软件开发中,设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式(Factory Method Pattern) 作为创建型设计模式之一,常常被用来解决对象创建问题。它通过将对象的创建交给子类来解耦代码,使得代码更具灵活性与扩展性。

        工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法让一个类的实例化推迟到其子类。这种模式常用于类的实例化逻辑非常复杂,或者需要提供多种类型的实例,而又不希望让客户端代码直接接触到具体类的实现时。

2.工厂方法模式的结构

  • Product(产品接口):声明所有具体产品类需要实现的接口。
  • ConcreteProduct(具体产品类):实现 Product 接口的具体类。
  • Creator(创建者类):声明工厂方法,通常是抽象类或接口,用于创建 Product 对象。
  • ConcreteCreator(具体创建者类):实现 Creator 类,返回具体的 ConcreteProduct 对象。

3.工厂方法模式的优缺点

优点:

  • 解耦:工厂方法模式将产品的创建和使用分离,避免了客户端程序与具体产品类的紧密耦合。
  • 易扩展:新增产品类时,只需增加新的具体工厂类,客户端不需要修改,符合开闭原则。
  • 封装复杂性:创建对象的过程可以被封装在工厂中,客户端无需关心创建过程的细节。

缺点:

  • 增加代码量:每增加一个具体产品,都需要相应的具体工厂类,这会导致类的数量增多。
  • 客户端调用不方便:如果产品种类很多,工厂类会增多,客户端代码可能会变得复杂。

二、图形工厂示例

        为了更好地理解工厂方法模式,我们通过一个简单的图形绘制的例子来练习实现工厂方法模式。

1. 需求分析

        我们需要设计一个图形绘制程序,支持绘制多种类型的图形(如圆形、三角形等)。每种图形的创建逻辑不同,为了将图形的创建过程与客户端代码解耦,我们决定使用工厂方法模式。

2. 设计类结构

  • Shape接口:声明所有图形的绘制方法。
  • 具体图形类:如 CircleTriangle 等,实现 Shape 接口,定义图形的绘制行为。
  • 抽象工厂类 ShapeFactory:声明工厂方法 createShape(),用于创建图形。
  • 具体工厂类:如 CircleFactoryTriangleFactory,实现工厂方法并返回对应的图形对象。

3. 实现代码

        以下是我们实现的代码:

// 图形接口
public interface Shape {
    void draw();
}

// 圆形类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画了一个圆");
    }
}

// 三角形类
public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画了一个三角形");
    }
}

// 抽象工厂类
public abstract class ShapeFactory {
    public abstract Shape createShape();  // 工厂方法
}

// 圆形工厂
public class CircleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// 三角形工厂
public class TriangleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Triangle();
    }
}

// 测试类
public class TestMethodFactory {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();  // 绘制圆形

        ShapeFactory triangleFactory = new TriangleFactory();
        Shape triangle = triangleFactory.createShape();
        triangle.draw();  // 绘制三角形
    }
}

4. 运行结果

        当我们运行 TestMethodFactory 类时,会得到如下输出:

画了一个圆

画了一个三角形

5. 分析

  • ShapeFactory 类作为抽象工厂类,声明了 createShape() 方法,具体的工厂类 CircleFactoryTriangleFactory 实现了这个方法,分别返回了不同的图形对象。
  • TestMethodFactory 类作为客户端,使用了不同的工厂来创建不同的图形对象,而无需关注图形的具体创建过程。

6. 总结

        通过本次练习,我们深入了解了工厂方法模式的应用。工厂方法模式通过将对象创建逻辑交给子类来实现,使得代码更加解耦,易于扩展。如果以后需要增加新的图形类型,只需添加新的工厂类和对应的图形类,而不需要修改客户端代码。这种设计模式符合 开闭原则,能够使代码在面对变化时更加灵活。


三、总结与反思

  • 工厂方法模式帮助我们解决了创建对象的问题,将对象的创建交给工厂方法,避免了客户端直接依赖于具体的实现类。
  • 它使得我们能够灵活地扩展系统功能,如需要增加新的图形类型,只需添加新的工厂类。
  • 通过工厂方法模式,客户端无需知道具体的创建逻辑,只关心工厂返回的产品对象,从而简化了代码的使用和维护。

如果你对工厂方法模式有任何疑问或想法,欢迎在评论区留言交流!


希望这篇博客能帮助你更好地理解工厂方法模式。如果你有任何问题,或者想要更多的设计模式实例,请随时向我提问!

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

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

相关文章

Unity网络框架对比 Mirror|FishNet|NGO

在Unity中制作非单机项目常用的免费网络框架,这里选取了三款比较火的网络框架,Mirror、FishNet和Netcode for GameObject(NGO)。 比较了最常用的免费网络解决方案。可能还有值得探索的付费选项。您需要对此进行自己的研究。数据表格更新日志截止到&#…

【C++】深度剖析 scanf 函数:原理、应用与优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯scanf 函数的基本原理💯基本用法示例常见占位符示例 💯使用 scanf 时的注意事项💯引入 cstdio 头文件💯scanf 与 cin 的对比…

YOLOv1 (You Only Look Once)

YOLO (You Only Look Once) 是一种经典的目标检测算法,旨在通过一个统一的卷积神经网络(CNN)进行目标检测,最大化检测速度并保持较高的精度。YOLO 在目标检测领域产生了巨大的影响,并且经过了多个版本的迭代。下面是 Y…

【Verilog】实验二 数据选择器的设计与vivado集成开发环境

目录 一、实验目的 二、实验环境 三、实验任务 四、实验原理 五、实验步骤 top.v mux2_1.v 一、实验目的 1. 掌握数据选择器的工作原理和逻辑功能。 2. 熟悉vivado集成开发环境。 3. 熟悉vivado中进行开发设计的流程。 二、实验环境 1. 装有vivado的计算机。 2. Sw…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

今天我们来聊聊Maven中两个高级的概念—— 插件和目标

插件&#xff08;plugin&#xff09; Maven的核心是一个插件执行框架;所有的工作都是由插件完成的。 Maven中Plugin分为两种类型&#xff1a; build类型Plugin只能在build阶段执行&#xff0c;在POM中需要在 <build/> 标签下进行配置。 reporting类型&#xff1a;在si…

【触想智能】自动售票机选择工控一体机配套的原因分析

自动售票机是现代公共交通系统中常见的设备之一&#xff0c;它能够方便、快速地为乘客提供票务服务。为了实现高效、可靠的运营&#xff0c;许多自动售票机都采用工控一体机作为核心控制硬件。 触想工控一体机TPC-W200系列 下面&#xff0c;触想智能小编为大家分析为什么自动售…

[计算机网络] HTTP/HTTPS

一. HTTP/HTTPS简介 1.1 HTTP HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 …

element-ui的下拉框报错:Cannot read properties of null (reading ‘disabled‘)

在使用element下拉框时&#xff0c;下拉框option必须点击输入框才关闭&#xff0c;点击其他地方报错&#xff1a;Cannot read properties of null (reading disabled) 造成报错原因&#xff1a;项目中使用了el-dropdown组件&#xff0c;但是在el-dropdown里面没有定义el-dropdo…

新一代零样本无训练目标检测

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…

30.100ASK_T113-PRO 用QT编写视频播放器(一)

1.再buildroot中添加视频解码库 X264, 执行 make menuconfig Target packages -->Libraries --> Multimedia --> X264 CLI 还需要添加 FFmpeg 2. 保存,重新编译 make all 3.将镜像下载开发板

Python办公自动化,批量生成Excel案例数据集

在数据分析的世界里&#xff0c;数据是核心&#xff0c;而如何高效地生成和处理数据则成为每位数据分析师必备的技能之一。今天&#xff0c;我们要探讨一个有趣的话题——“造数”。 但这里的“造数”并非意味着编造数据&#xff0c;而是指在确保数据安全的前提下&#xff0c;…

在线绘制Nature Communication同款双色、四色火山图,突出感兴趣的基因

导读&#xff1a;火山图通常使用三种颜色分别表示显著上调&#xff0c;显著下调和不显著。通过为特定的数据点添加另一种颜色&#xff0c;可以创建双色或四色火山图&#xff0c;从而更直观地突出感兴趣的数据点。 《Nature Communication》文章“Molecular and functional land…

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑 目录 文章目录 【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要数据与结论&#xff09;相关工作后续优化方向 后记 检索增强…

ETSI EN 300328 标准的一些笔记

ETSI - European Telecommunications Standards Institute 欧洲电信标准化协会 ETSI EN 300328 是欧洲协调标准&#xff0c;此标准适用于工作在2.4G频段范围内运行的宽频传输系统和设备的无线电频谱。 例如 WIFI、Zigbee、蓝牙、 (国内的星闪)。不涵盖UWB。 符合了EN 300328标…

VSCode:代码格式化插件

settings.json文件中添加如下配置并保存 {"workbench.sideBar.location": "left","cssrem.rootFontSize": 80,"git.ignoreWindowsGit27Warning": true,"eslint.codeAction.showDocumentation": {"enable": true…

Redis实现限量优惠券的秒杀

核心&#xff1a;避免超卖问题&#xff0c;保证一人一单 业务逻辑 代码步骤分析 全部代码 Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {Resourceprivate ISeckillVoucher…

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么&#xff1f; PR&#xff0c;全称Pull Request&#xff08;拉取请求&#xff09;&#xff0c;是一种非常重要的协作机制&#xff0c;它是 Git 和 GitHub 等代码托管平台中常见的功能&#xff0c;被广泛用于参与社区贡献&#xff0c;从而促进项目的发展。 PR的整个过…

大数据技术Kafka详解 ② | Kafka基础与架构介绍

目录 1、kafka的基本介绍 2、kafka的好处 3、分布式发布与订阅系统 4、kafka的主要应用场景 4.1、指标分析 4.2、日志聚合解决方法 4.3、流式处理 5、kafka架构 6、kafka主要组件 6.1、producer(生产者) 6.2、topic(主题) 6.3、partition(分区) 6.4、consumer(消费…

Docker中配置Mysql主从备份

Mysql配置主从备份 一、Docker中实现跨服务器主从备份二、配置步骤1.配置主库2.配置从库3.遇到问题3.其它使用到的命令 一、Docker中实现跨服务器主从备份 在 Docker 中配置 MySQL 主从备份主要通过 MySQL 主从复制实现 二、配置步骤 1.配置主库 # 进入mysql主库容器 docke…