前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「聊设计模式」之工厂方法模式(Factory Method)

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

原创
作者头像
bug菌
修改2023-10-31 00:11:07
3621
修改2023-10-31 00:11:07
举报

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

大家下午好,我是bug菌,今天我们继续聊设计模式。

前言

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

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

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

摘要

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

工厂方法模式

概念

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

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

模式结构

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

  1. 抽象工厂(`Creator):提供一个创建产品的接口,它包含一个创建产品的抽象方法。在Java中,该接口通常由一个抽象类或者一个接口实现。
  2. 具体工厂(Concrete Creator):实现Creator接口中的创建产品方法,返回具体的产品实例。
  3. 抽象产品(Product):定义一个产品的抽象类,它包含了一些基本的属性和方法,这些方法或属性将会被具体的产品类所实现和覆盖。
  4. 具体产品(Concrete Product):实现抽象产品接口中定义的方法和属性。

如下是工厂方法模式的UML类图:

工厂方法模式UML类图
工厂方法模式UML类图

优缺点

优点

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

  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,提供给同学们参考性学习。

总结

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

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • 工厂方法模式
    • 概念
      • 模式结构
        • 优缺点
          • 优点
          • 缺点
        • 应用场景
        • 模式实现
          • 抽象工厂
            • 具体工厂
              • 抽象产品
                • 具体产品
                  • 测试用例
                    • 测试用例代码解析
                  • 小结
                    • 附录源码
                    • 总结
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                    http://www.vxiaotou.com