「聊设计模式」之工厂方法模式(Factory Method)

news2024/11/26 23:48:46

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  设计模式是指在软件设计中,经过总结和提炼的,能够解决特定问题的经验性的总结。它不是一种可直接转化为代码的完整设计,而是一种描述在不同情况下如何解决问题的一种方案。

  工厂方法模式(Factory Method)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,我们不会指定要创建哪个类的对象,而是由子类决定要创建哪个类的对象。这样我们就可以将对象的创建从代码中解耦,使得代码更加灵活。

  本文将围绕工厂方法模式展开,介绍它的定义、结构、实现、优缺点及适用场景。此外,本文还提供了Java代码实现和测试用例,帮助读者更好地理解工厂方法模式。

摘要

  本文将介绍工厂方法模式的定义、结构、实现、优缺点及适用场景。其中,定义部分阐述了什么是工厂方法模式,结构部分介绍了工厂方法模式的UML图和各个角色的职责,实现部分提供了Java代码实现,优缺点部分分析了工厂方法模式的优劣,适用场景部分列出了适用于工厂方法模式的情景。此外,本文还提供了测试用例以验证工厂方法模式的正确性。

工厂方法模式

如何定义?

  工厂方法模式定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式使一个类的实例化延迟到其子类。

  工厂方法模式通过定义一个抽象的工厂接口来声明创建产品对象的操作,而将实际创建工作推迟到子类中进行。这样做的好处是,我们可以针对不同的产品需求,提供一个统一的接口,而使用者只需要关心接口,而不需要关心具体的实现细节。在需要新增产品时,只需要添加一个新的产品类和相应的工厂类即可。

结构

工厂方法模式包含以下角色:

  1. 抽象工厂(Creator):提供一个创建产品的接口,它包含一个创建产品的抽象方法。在Java中,该接口通常由一个抽象类或者一个接口实现。

  2. 具体工厂(Concrete Creator):实现Creator接口中的创建产品方法,返回具体的产品实例。

  3. 抽象产品(Product):定义一个产品的抽象类,它包含了一些基本的属性和方法,这些方法或属性将会被具体的产品类所实现和覆盖。

  4. 具体产品(Concrete Product):实现抽象产品接口中定义的方法和属性。

工厂方法模式模拟

以下是工厂方法模式的Java代码实现。

抽象工厂

public interface Creator {
    Product createProduct();
}

具体工厂

public class ConcreteCreator implements Creator {
    @Override
    public Product createProduct() {
        return new ConcreteProduct();
    }
}

抽象产品

public interface Product {
    void doSomething();
}

具体产品

public class ConcreteProduct implements Product {
    @Override
    public void doSomething() {
        System.out.println("具体产品做了某些事情");
    }
}

测试用例

public class Client {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        Product product = creator.createProduct();
        product.doSomething();
    }
}

代码解析:
如上是一个简单的工厂模式的示例代码,包括以下几个部分:

  1. 客户端代码(Client):其中包含一个 main 方法,用来演示如何使用工厂模式创建产品并调用其方法。

  2. 抽象产品接口(Product):定义了产品的基本方法。

  3. 具体产品类(ConcreteProduct):实现了抽象产品接口中定义的方法。

  4. 抽象工厂接口(Creator):定义了工厂方法(createProduct),用来创建产品实例。

  5. 具体工厂类(ConcreteCreator):实现了抽象工厂接口中的工厂方法(createProduct),用来创建具体的产品实例。

  在客户端代码中,先创建了一个具体的工厂实例(ConcreteCreator),然后通过工厂实例的 createProduct 方法来创建一个具体的产品实例(ConcreteProduct)。最后调用产品实例的 doSomething 方法来执行具体的功能。

测试用例执行结果如下:

在这里插入图片描述

小结

  本文介绍了工厂方法模式的概念、实现、优点和应用。在工厂方法模式中,我们通过定义一个工厂接口来实现对象的创建,并且可以将对象创建的细节隐藏起来。通过使用工厂方法模式,我们可以将代码的复杂性降到最低,从而更容易进行扩展和维护。

优缺点

工厂方法模式有以下优点:

  1. 工厂方法模式将产品的实现和客户端代码隔离开来,使得客户端代码无需关心具体的产品实现细节。

  2. 工厂方法模式遵循了单一职责原则,每个工厂只负责生成一个产品,符合高内聚低耦合的设计思想。

  3. 工厂方法模式可以很方便地扩展新的产品,只需要添加相应的产品类和工厂类即可。

  4. 工厂方法模式可以很容易地用来创建工厂的实现,这使得代码更加灵活。

工厂方法模式也有以下缺点:

  1. 工厂方法模式的创建方法是由抽象工厂接口定义的,如果需要添加新的产品,就需要修改抽象工厂接口和所有具体工厂实现。

  2. 工厂方法模式虽然可以用于扩展新的产品,但是一旦产品族和产品等级的数量过多,就会导致类的数量急剧增加,从而使得系统难以维护。

适用场景

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

  1. 需要对产品实现进行抽象,客户端只需要调用抽象工厂接口,而不需要关心具体的实现细节。

  2. 需要动态添加新的产品,只需要添加相应的产品类和工厂类即可。

  3. 需要一个统一的工厂接口来创建产品,但是不希望客户端代码直接依赖于具体的实现。

  4. 需要遵循单一职责原则,使得每个工厂只负责一个产品的生成。

总结

  工厂方法模式是一种非常有用的设计模式,它可以帮助我们解决对象创建的问题,从而提高我们的代码的可维护性和可扩展性。在实际应用中,我们可以通过工厂方法模式来实现各种功能,例如对象的创建、事件的处理等等。因此,掌握工厂方法模式是非常重要的。

附录源码

如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

雨量监测站:智能监测,超限提醒

在我们的日常生活和工作中,了解天气状况是非常重要的一环。而雨量监测站作为现代气象监测的重要组成部分,为我们提供了更加精准、实时的降雨信息。 一、提供精准的降雨数据 雨量监测站利用先进的仪器和设备,持续监测降雨量,为气象…

vue入门-->前后端分离vue简介,vue入门,vue生命周期

前后端分离&vue简介vue入门vue生命周期 1.前后端分离&vue简介 什么是前后端分离? 前后端分离,是开发模式上的前后端分离。 当然还有项目架构方面的前后端分离,也就是在考虑请求并发,服务器性能,处理请求的效率…

68、Spring Data JPA 的 方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体) 2、Query查询(半自动:提供 SQL 或 JPQL 查询) 3、自定义查询(全手动) ★ 方法名关键字查询&…

微信超实用的隐藏功能:群发上千人,定时发圈,自动回复,一键转发朋友圈

多账号聚合 企业可将员工的工作微信聚合到系统上管理,在同一个页面就能同时收发多个微信的消息,无需频繁地切换设备与账号。将微信号分配给对应的员工,可对已有微信号进行监管。 群发无限制 微信自带的群发是有200人数限制的,对于…

android 点9记录

记录一个9点的4个边作用,左上表示拉伸的区域,需要2边都有黑点,如果只有一边,运行起来会有奇怪的投影,右边和下边默认拉满即可。

无涯教程-JavaScript - MUNIT函数

描述 MUNIT函数返回指定尺寸的单位矩阵。 语法 MUNIT (dimension)争论 Argument描述Required/OptionalDimension Dimension是一个整数,指定要返回的单位矩阵的尺寸。 尺寸必须大于零。 Required Notes MUNIT返回一个数组。因此,应将其作为数组公式输入 MUNIT (N)$\begin{m…

朴素贝叶斯案例分析

贝叶斯模型是利用先贝叶斯定理进行计算的一种机器学习模型,并且此处涉及先验概率和后验概率。比如我们都知道去赌场会十赌九输,此是以前的经验,即为先验概率,也或者大家都知道抛硬币时上下面第一次都是1/2概率,这均为先…

如何制作一篇公众号推文?纯干货

公众号推文是一种通过微信公众号平台向用户传播信息和内容的方式,具有广泛的受众群体和良好的传播效果。下面伯乐网络传媒给大家分享关于如何制作一篇公众号推文的一些建议和步骤,建议收藏起来慢慢看! 确定目标受众:在开始制作推文…

Matlab编程中函数的重命名方法

Matlab编程中函数的重命名方法 在进行matlab编程时候,有时需要根据自己的习惯,需要对函数重命名。本文简要介绍重命名的方法。 一、重命名的方法 通过和赋值号实现,如下所示: 新函数名原函数名二、具体举例 clc clear all %将…

第二章-H3C-网络设备操作入门

6.2 路由器与交换机的作用与特点 6.2.1 路由器的作用与特点 路由器的作用 1.连接具有不同介质的链路 2.连接网络或子网,隔离广播 3.对数据报文执行寻址和转发 4.交换和维护路由信息 6.2.2 交换机的作用与特点 交换机的作用 1.连接多个以太网物理网段,隔…

武汉凯迪正大—雷电冲击电压发生器

雷电冲击电压发生器系统特点 1.采用PLC可编程控制器技术,使控制系统实现超小型化及高可靠性能的智能自动控制和测量;配合我公司的数字化测控系统方便的与计算机连接,实现计算机智能自动控制、测量和管理 。 2.输出极…

不负昭华,前程似锦,新一批研发效能认证证书颁发丨IDCF

亲爱的认证学员, 恭喜你成功获得由国家工业和信息化部教育与考试中心颁发的职业技术证书——《研发效能(DevOps)工程师国家职业技术认证》。你的努力和才华得到了官方的认可,这是你职业生涯中的一个重要的里程碑。 这个证书不仅代表着你的专业知识和技…

JeecgBoot 低代码安装 运行开发

技术文档 技术官网: http://www.jeecg.com在线演示 : http://boot.jeecg.com标签 :BasicTable 表格 - JeecgBoot 文档中心入门视频: https://space.bilibili.com/454617261/channel/series 微服务开发: 单体切换为微…

数据结构与算法课后题-第二章(顺序表)

第二章 01题目&#xff0c;存储相对紧凑&#xff0c;所以存储的密度大。 04题目&#xff0c;顺序表可以按照序号随机存取&#xff0c;时间的复杂度为O(1)。 第7题目分析 #include <iostream> using namespace std;#define MaxSize 50 typedef int ElemType; typedef…

算法通过村第八关-树(深度优先)白银笔记|深度和高度问题

文章目录 前言1. 最大深度问题2. 判断平衡树3. 最小深度4. N叉树的最大深度总结 前言 提示&#xff1a;我的整个生命&#xff0c;只是一场为了提升社会地位的低俗斗争。--埃莱娜费兰特《失踪的孩子》 这一关我们看一些比较特别的题目&#xff0c;关于二叉树的深度和高度问题。这…

ORA-00257:archiver error.Connect internal only,until freed.

ORA-00257:archiver error.Connect internal only,until freed. 1、报错原因 归档满了2、解决方法 1.查看归档路径 archive log list;Arcive destination USE_DB_RECOVERY_FILE_DEST此参数代表归档存放路径&#xff0c;本地存放为/opt/oracle…&#xff0c;asm为archdg …

保姆级式教程:教你制作电子画册

在这个数字化时代&#xff0c;电子画册成为了展示和分享作品的一种流行方式。制作一个精美的电子画册不仅可以展示你的创意和才华&#xff0c;还可以吸引更多人的关注和欣赏。下面告诉大家一些小步骤&#xff0c;带你一步步学习如何制作电子画册。 1.收集和整理作品 接下来&am…

ICS TRIPLEX T8151B 数字量输入模块

ICS TRIPLEX T8151B 是一种数字量输入模块&#xff0c;通常用于工业控制和自动化系统中&#xff0c;用于监测和采集数字输入信号&#xff0c;例如开关状态、传感器状态或离散信号。以下是可能包括在 ICS TRIPLEX T8151B 数字量输入模块中的一些常见产品功能&#xff1a; 数字输…

全局异常处理+JSR303验证

一、前言 我们在日常开发中&#xff0c;避不开的就是参数校验&#xff0c;有人说前端不是会在表单中进行校验的吗&#xff1f;在后端中&#xff0c;我们可以直接不管前端怎么样判断过滤&#xff0c;我们后端都需要进行再次判断&#xff0c; 为了安全 。因为前端很容易拜托&…

Chemdraw 使用小技巧

Chemdraw 快速画分子结构 Chemdraw中有个join 功能&#xff0c;可将多个分子快速的连接在一起&#xff0c;还有group以及ungroup 功能也可以快速实现。Chemdraw画布太小&#xff0c;利用page-document settings, Layout-Poster&#xff0c;修改height, widthChemdraw快速创建新…