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

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


前言

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

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

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

摘要

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

工厂方法模式

模式如何定义?

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

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

模式结构

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

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

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

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

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

其结构图如下所示:

优缺点

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

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

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

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

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

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

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

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

适用场景

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

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

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

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

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

模式的实现

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

抽象工厂

java 复制代码
package com.example.javaDesignPattern.factoryMethod;

/**
 *  抽象工厂
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 16:45
 */
public interface Creator {
    Product createProduct();
}

具体工厂

java 复制代码
package com.example.javaDesignPattern.factoryMethod;

/**
 * 具体工厂
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 16:46
 */
public class ConcreteCreator implements Creator {
    @Override
    public Product createProduct() {
        return new ConcreteProduct();
    }
}

抽象产品

java 复制代码
package com.example.javaDesignPattern.factoryMethod;

/**
 * 抽象产品
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 16:50
 */
public interface Product {
    void doSomething();
}

具体产品

java 复制代码
package com.example.javaDesignPattern.factoryMethod;

/**
 * 具体产品
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 16:51
 */
public class ConcreteProduct implements Product {
    @Override
    public void doSomething() {
        System.out.println("具体产品做了某些事情");
    }
}

测试用例

java 复制代码
package com.example.javaDesignPattern.factoryMethod;

/**
 * 测试用例
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 16:51
 */
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 方法来执行具体的功能。

小结

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

附录源码

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

总结

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

☀️建议/推荐你


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

📣关于我


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

相关推荐
一颗花生米。21 分钟前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼21 分钟前
Java基础-单例模式的实现
java·开发语言·单例模式
bobostudio199526 分钟前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
ok!ko4 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2401_857622664 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589364 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰5 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
拉里小猪的迷弟5 小时前
设计模式-创建型-常用:单例模式、工厂模式、建造者模式
单例模式·设计模式·建造者模式·工厂模式
哎呦没6 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch6 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j