【设计模式】什么场景可以考虑使用简单工厂模式

这篇具有很好参考价值的文章主要介绍了【设计模式】什么场景可以考虑使用简单工厂模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

工厂模式是一种创建型模式,主要作用就是创建对象,将对象的创建过程和使用的过程进行解耦。我们平时说的工厂模式实际上是对三种不同类型的工厂模式的统称,简单工厂、工厂方法、抽象工厂,而在23种设计模式中,只定义了工厂方法和抽象工厂,将简单工厂看作是工厂方法的一种特例,本篇主要讲述的是简单工厂

简单工厂,就像它的名字一样突出一个简单,就是将业务流程代码中直接使用new关键字来创建对象,修改为通过一个工厂类创建对象,这就是简单工厂。如果仅仅只是将new操作转移到了一个新的类里面,看起来只是在徒增类的数量和代码量,并没有什么意义。

那为什么我们还要使用简单工厂模式呢?
是因为它在某些特定的场景下有其存在的价值,让我们从不同的场景来看看。

2.从不同场景看简单工厂的意义

2.1.框架或工具的封装

除了日常业务开发之外,有时候我们也可能得做一些框架或者工具的开发,这部分开发出来的工具需要提供给其他的开发人员使用,而他们在使用的时候,第一步就是获取到这个工具的对象,这种情况下就可以给使用者提供一个简单工厂,让使用者通过工厂来创建对象。
例如在Java中使用日历相关的工具Calendar就是通过简单工厂提供的获取日历对象的方法,如下图:
【设计模式】什么场景可以考虑使用简单工厂模式,# 设计模式,架构与设计,设计模式,简单工厂模式,java
我们做类似的框架或工具开发的时候,完全可以参照Calendar的方式,给使用者提供创建对象的能力,从而让使用者无需关心对象的实际创建过程,而是只需要通过特定的方法和参数,就能获取到一个可供使用的对象。

2.2.复杂业务对象的创建

即使是在做业务相关开发,有时候也会涉及到一些相对复杂的业务对象的创建(例如DDD中的领域对象),这时候可以使用简单工厂将产品对象的创建流程从业务流程中抽离。由于创建对象的复杂性被隔离在工厂类中,因此当涉及到产品类的变化时,比如增加新功能、改变实现方式等,只需要改动工厂类,不会对使用产品的其他模块造成影响,有利于产品创建逻辑的集中管理,以及系统的维护和版本升级。


之前在做一个项目开发的时候使用过简单工厂处理过Domain对象的创建,先说一下背景:

这个项目使用的时COLA架构(一种DDD的代码层面实践的框架),在这个架构的分层中Domain层属于最底层,如下图中的demoWeb-domain
【设计模式】什么场景可以考虑使用简单工厂模式,# 设计模式,架构与设计,设计模式,简单工厂模式,java
Domain层中会完成大部分的业务逻辑,但我们知道业务流程中往往伴随着与中间件其他服务之间的交互(例如数据库的存取操作),但这部分交互不应该由领域对象来实现。

COLA中的做法就是提供一个“防腐层”来实现,所谓的防腐层就是在domain层中定义与中间件交互的interface再交由infrastructure来实现,这样在domain层就只需要关心自己需要做一个什么交互,而不需要关心具体的交互实现,如下的红框所示。
【设计模式】什么场景可以考虑使用简单工厂模式,# 设计模式,架构与设计,设计模式,简单工厂模式,java
背景介绍完了,说一下这里面存在一个问题,就是Domain对象为了保证业务模型的纯洁性,一般不会使用Spring来管理领域对象的生命周期,在这种情况下如何才能将gatewayImpl对象注入到领域对象中呢?

答案是在Infrastructure层中,将getewayImpl对象set到领取对象中,如果领域对象的创建过程相对复杂,就可以使用简单工厂进行创建,统一管理创建逻辑,代码如下:

@Component
public class MsgWecomAppFactory {

    @Resource
    private MsgWecomGateway msgWecomGateway;
    @Resource
    private MsgWecomCacheGateway msgWecomCacheGateway;

    @Resource
    private WecomHttpHelper wecomHttpHelper;

    /**
     * 创建企业微信应用号领域对象,用于确认消息
     *
     * @param agentId 应用号ID
     * @return 领域对象
     */
    public MsgWecomApp createMsgWecomAppForConfirm(String agentId) {
        MsgWecomApp msgWecomApp = new MsgWecomApp();
        // 1.查询企业微信应用配置信息
        Optional<MsgWecomAppConfig> appConfig = msgWecomGateway.getWecomAppConfigByAgentId(agentId);
        Assert.isTrue(appConfig.isPresent(), "企业微信应用号配置信息不存在,执行失败,agentId:" + agentId);
        msgWecomApp.setConfig(appConfig.get());

        msgWecomApp.setMsgWecomCacheGateway(msgWecomCacheGateway);
        msgWecomApp.setMsgWecomGateway(msgWecomGateway);
        msgWecomApp.setWecomHttpHelper(wecomHttpHelper);
        return msgWecomApp;
    }

    /**
     * 创建企业微信应用号领域对象,用于发送消息
     *
     * @param agentId 应用号ID
     * @param phones  手机号
     * @return 领域对象
     */
    public MsgWecomApp createMsgWecomAppForSend(String agentId, Set<String> phones) {
        MsgWecomApp msgWecomApp = new MsgWecomApp();
        // 1.查询企业微信应用配置信息
        Optional<MsgWecomAppConfig> appConfig = msgWecomGateway.getWecomAppConfigByAgentId(agentId);
        Assert.isTrue(appConfig.isPresent(), "企业微信应用号配置信息不存在");
        msgWecomApp.setConfig(appConfig.get());

        // 2.查询用户信息,优先使用手机号查询,如果手机号为空或手机号未查询到则使用邮箱查询
        List<MsgWecomMemberInfo> msgWecomMemberInfos = new ArrayList<>();
        if (CollUtil.isNotEmpty(phones)) {
            msgWecomMemberInfos = msgWecomGateway.listWecomMemberInfoByPhone(phones);
            // 对比参数中的手机号与查询到的手机号,获取差集
            List<String> existPhone = msgWecomMemberInfos.stream().map(MsgWecomMemberInfo::getPhone).collect(Collectors.toList());
            msgWecomApp.setNotExistPhones(CollUtil.subtractToList(phones, existPhone));
        }

        msgWecomApp.setToSendMemberInfos(msgWecomMemberInfos);

        msgWecomApp.setMsgWecomCacheGateway(msgWecomCacheGateway);
        msgWecomApp.setMsgWecomGateway(msgWecomGateway);
        msgWecomApp.setWecomHttpHelper(wecomHttpHelper);
        return msgWecomApp;
    }
}

2.3.与其他模式的组合使用

策略模式中的选择器实现:
在SpringBoot优雅使用策略模式这一篇博客中提到了如何使用Spring对Bean的管理能力,来实现策略模式的选择器。同样的,如果没有使用Spring或者业务对象的生命周期不需要Spring框架介入时,就可以使用简单工厂+单例的方式来实现,代码如下:

/**
 * 策略选择器工厂
 */
public class StrategySelectorFactory {

    private static final Map<String, Strategy> STRATEGY_MAP = new java.util.HashMap<>();

    static {
        STRATEGY_MAP.put("A", new StrategyA());
        STRATEGY_MAP.put("B", new StrategyB());
    }

    public static Strategy getStrategy(String strategyKey) {
        if (strategyKey == null || strategyKey.isEmpty()) {
            throw new IllegalArgumentException("strategyKey can not be empty");
        }
        return STRATEGY_MAP.get(strategyKey);
    }
}

3.总结

本篇主要讲述了工厂模式中的特例:简单工厂模式,并通过3种不同的场景来介绍这种模式存在的意义,有以下几方面:

  • 封装对象创建过程: 将对象的创建过程封装工厂类中,使用者无需了解具体产品的创建细节,只需调用工厂类提供的静态方法即可得到所需的产品对象。这样可以隐藏产品类的具体实现,降低耦合度。
  • 控制逻辑集中: 将复杂对象的创建对象逻辑集中在工厂类中,如果需要修改或扩展产品类型时,只需要修改工厂类中的代码。这使得添加新产品或者调整产品创建逻辑更加方便、集中管理,也有利于系统的维护和版本升级
  • 组合其他模式满足特定的需求: 在某些应用场景中,如根据参数动态选择不同类型的对象实例化,简单工厂+单例提供简洁有效的解决方案,避免了直接使用 new 关键字创建对象带来的硬编码问题。

最后,虽然简单工厂模式在一定程度上提高了灵活性和可维护性,但它也有其局限性,例如违反了开闭原则,每增加一个新产品就需要修改工厂类的代码。

但瑕不掩瑜,简单工厂模式在很多简单场景下发挥着重要的作用。文章来源地址https://www.toymoban.com/news/detail-801189.html

到了这里,关于【设计模式】什么场景可以考虑使用简单工厂模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式什么情况下适合使用呢?

    很多情况下设计模式是一种经过验证的解决特定问题的最佳实践。设计模式提供了一种标准化的方式来解决常见的软件设计问题,并提供了一种可重用的解决方案。设计模式可以帮助开发人员编写具有高可维护性、可扩展性和可重用性的代码。 设计模式适用于以下情况: 需

    2024年02月15日
    浏览(32)
  • 【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

    状态模式是什么? 状态模式,也被称作状态对象模式,是一种行为设计模式。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了解对象内部状态的具体实现,仅需通过简单的

    2024年01月20日
    浏览(34)
  • 【有趣的设计模式】23 种设计模式详解和场景分析

    七大设计原则 1、单一原则:一个类只负责一个职责 2、开闭原则:对修改关闭,对扩展开放 3、里氏替换原则:不要破坏继承关系 4、接口隔离原则:暴露最小接口,避免接口过于臃肿 5、依赖倒置原则:面向抽象编程 6、迪米特 法则:尽量不跟陌生人讲话 7、合成复用原则:

    2024年02月14日
    浏览(30)
  • 设计模式应用场景

    工厂模式(Factory Pattern):使用工厂方法创建对象,而不是使用new直接实例化对象。 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关对象的接口,而无需指定它们的具体类。 单例模式(Singleton Pattern):限制一个类只能有一个实例并提供一个全局访问点

    2024年02月09日
    浏览(23)
  • 腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

    状态模式是什么? 状态模式,也被称作状态对象模式,是一种行为设计模式。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了解对象内部状态的具体实现,仅需通过简单的

    2024年01月20日
    浏览(31)
  • 【设计模式-02】Strategy策略模式及应用场景

    Java 官方文档 Overview (Java SE 18 JDK 18) module index https://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 JDK 18) declaration: module: java.base, package: java.util, interface: Comparator https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Compar

    2024年01月16日
    浏览(34)
  • 【设计模式-03】Strategy策略模式及应用场景

    Java 官方文档 Overview (Java SE 18 JDK 18) module index https://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 JDK 18) declaration: module: java.base, package: java.util, interface: Comparator https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Compar

    2024年01月22日
    浏览(29)
  • 【企业场景】设计模式重点解析

    在平时的开发中,涉及到设计模式的有两块内容: 我们平时使用的框架(比如spring、mybatis等) 我们自己开发业务使用的设计模式。 在平时的业务开发中,其实真正使用设计模式的场景并不多,虽然设计号称有23种之多(不同的纬度可能会更多,不同程序员看法也不同) 但是

    2024年04月12日
    浏览(26)
  • 设计模式之【备忘录模式】,“后悔药”是可以有的

    全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我 备忘录模式(Memento Pattern)又称为快照模式(Snapshot Pattern)或令牌模式(Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到

    2024年02月06日
    浏览(65)
  • 【设计模式】23种设计模式——单例模式(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    介绍 所谓类的单例设计模式,就是采取一定的方法, 保证在整个的软件系统中,对某个类只能存在一个对象实例 ,并且该类只提供一个取得其对象实例的方法(静态方法)。 比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包