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

2024-06-16 19:04

本文主要是介绍设计模式之工厂方法模式(Factory Method Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 1.1、前言
    • 1.2、工厂方法模式简介
      • 1.2.1、工厂方法模式的主要特点
      • 1.2.2、工厂方法模式的主要结构
      • 1.2.3、使用工厂方法模式的好处
    • 1.3、SpringBoot中那些场景使用了工厂方法模式
    • 1.4、日常工作中那些业务场景可以使用工厂方法模式
    • 1.5、工厂方法模式实战(以某商场一次促销活动为例)
      • 1.5.1、实战场景简介

1.1、前言

        在开篇讲工厂方法模式之前我们来看一个场景小故事,女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到都是静态的东西呀,怎么办?
        别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
        第一次烤泥人,兹兹兹兹,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!
        第二次烤泥人,兹兹兹兹兹兹兹兹,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,黑人哪!
        第三次烤泥人,兹~ 兹~ 兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人种!
        其实这个过程还是比较有意思的,如果我们要用程序去实现类似这样的业务场景的话,大家会用什么方式呢?大多数人会说⽤ifelse语句呀,很简单的。就业务场景而言使用ifelse语句来实现确实没什么问题,但是如果有一天女娲一时兴起想造“火星人”、“开普勒-10b人”、“比邻星人”等一系列外星人又该怎么办呢?大多数人还会说继续⽤ifelse语句呀,很简单的。我只想说这样编码下去只能是编码⼀时爽,重构⽕葬场。这也许是造成“屎山”代码和很多⼈并不愿意接⼿别⼈的代码的原因吧。
        好的代码不只为了完成现有功能,也会考虑后续扩展。在结构设计上松耦合易读易扩展,在领域实现上⾼内聚不对外暴漏实现细节不被外部干扰。工厂方法模式在这方面有着先天的优势,工厂方法模式也能更合理的实现上述女娲造人的业务场景。

1.2、工厂方法模式简介

        工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但实际创建对象的工作由子类完成。这种模式的主要目的是降低类之间的耦合度,增强类的独立性,并提高系统的可维护性和可扩展性。

1.2.1、工厂方法模式的主要特点

  • 分离了算法和对象创建:通过工厂方法,我们可以将对象的创建和使用分离,使得代码更加清晰和易于维护。
  • 实现多态:工厂方法允许子类实现自己的行为,从而支持不同的创建策略。
  • 避免使用new关键字:工厂方法模式通过工厂方法代替new关键字,可以减少错误,并提高代码的可读性和可维护性。

1.2.2、工厂方法模式的主要结构

  • 工厂(Factory):负责创建对象,但不暴露如何创建对象的实现细节。
  • 抽象产品(Product):定义了产品对象的行为,但不暴露如何创建对象。
  • 具体产品(Concrete Product):实现了抽象产品定义的行为,并提供了创建对象的实际逻辑。
  • 客户端(Client):使用工厂来获取产品对象,并调用产品对象的行为。

1.2.3、使用工厂方法模式的好处

  • 简化客户端代码:客户端只需要知道如何使用工厂来获取对象,而不需要知道对象的创建细节。
  • 提高代码的可扩展性:当需要添加新的产品类型时,只需要创建一个新的具体产品类和相应的工厂类即可,而不需要修改客户端代码。
  • 降低类之间的耦合度:通过工厂方法模式,可以将对象的创建和使用分离,使得各个类之间的依赖关系更加清晰,提高了系统的可维护性和可扩展性。

        总之,工厂方法模式是一种常用的设计模式,它通过提供一种统一的接口来创建对象,降低了类之间的耦合度,提高了代码的可扩展性和可维护性。

1.3、SpringBoot中那些场景使用了工厂方法模式

  • Bean的创建:在Spring Boot中,通过工厂方法模式可以实现Bean的创建。Spring提供了一种方式让我们自定义Bean的创建逻辑,即通过实现FactoryBean接口或使用@Bean注解来创建Bean。这样可以更灵活地控制Bean的创建过程,实现定制化的Bean创建逻辑。

  • RestTemplate的创建:在Spring Boot中,RestTemplate是用于调用Restful服务的类,它通常会被注入到各个服务中。RestTemplate的创建可以通过工厂方法模式来实现,将RestTemplate的创建逻辑封装在一个工厂类中,并通过工厂方法来获取RestTemplate对象,从而实现灵活配置和管理RestTemplate。

  • 数据源的创建:在Spring Boot中,数据源是应用程序连接数据库的关键组件。通过工厂方法模式,可以将数据源的创建过程封装在一个工厂类中,根据不同的配置信息来创建不同的数据源对象,实现多数据源的管理和灵活切换。

  • 事件监听器的创建:在Spring Boot中,事件监听器用于监听应用程序内部的各种事件,如请求处理、对象创建销毁等。通过工厂方法模式,可以实现事件监听器的灵活创建和管理,将事件监听器的创建逻辑封装在工厂类中,并通过工厂方法来获取监听器对象。

        总之,工厂方法模式在Spring Boot中经常被用于Bean的创建、RestTemplate的创建、数据源的创建、事件监听器的创建等场景中,通过工厂方法模式可以实现对象的灵活创建和管理,提高代码的可扩展性和可维护性。

1.4、日常工作中那些业务场景可以使用工厂方法模式

        在日常工作中,工厂方法模式可以应用于多种业务场景,尤其是当需要在不同的条件下创建不同类型的对象时。以下是一些典型的业务,适合使用工厂方法模式:

  • 配置管理:当系统需要根据不同的环境(如开发、测试、生产)创建不同配置对象时,可以使用工厂方法模式。例如,不同环境的数据库连接配置、缓存配置等。

  • 数据导出:在需要将数据导出到不同格式(如CSV、Excel、PDF)的场景中,工厂方法模式可以用来创建导出器对象。

  • 消息发送:类似邮件发送的示例,当系统需要根据不同的消息类型(如短信、邮件、站内通知)创建不同的消息发送器时,工厂方法模式非常适用。

  • 服务集成:在微服务架构中,不同的服务可能需要集成不同的第三方服务。使用工厂方法模式可以创建特定的服务集成器实例。

  • 对象池管理:在需要对象池(如数据库连接池、线程池)的场景中,工厂方法模式可以帮助实现对象的复用和管理。

  • 插件系统:当系统需要动态加载和创建插件时,工厂方法模式可以用来创建插件实例,而不需要修改插件本身的代码。

  • 依赖注入:在Spring等框架中,工厂方法模式可以用来创建和注入依赖对象。例如,通过实现FactoryBean接口来定义自己的Bean创建逻辑。

  • 异常处理:在需要根据不同的异常类型创建不同策略的场景中,工厂方法模式可以帮助定义不同的异常处理器。

  • 资源管理:在需要根据不同资源类型(如文件、数据库记录)创建不同资源处理对象的场合,工厂方法模式可以提供一种灵活的解决方案。

  • UI组件创建:在Web应用开发中,根据用户配置或屏幕尺寸创建不同的UI也是工厂方法模式的适用场景。

        工厂方法模式的优点在于它提供了一个接口,允许子类决定实例化哪个类,使得实例化的过程延迟到子类中进行,增强了程序的灵活性和可扩展性。在设计系统时,如果预计到会有多种类型的对象需要创建,并且创建逻辑可能会随着时间变化,那么工厂方法模式是一个很好的选择。

1.5、工厂方法模式实战(以某商场一次促销活动为例)

1.5.1、实战场景简介

        某地一商店为了回馈老客户,针对满足条件的老客户发放对话卡、实物商品、优惠券三种奖品。其业务场景图如下:
图片1
        大家可以提前想一想使用工厂方法模式如何实现上述业务场景,具体实现过程详见下一篇博文工厂方法模式实战之某商场一次促销活动。

这篇关于设计模式之工厂方法模式(Factory Method Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067283

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例