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

「聊设计模式」之简单工厂模式(Simple Factory)

原创
作者头像
bug菌
修改2023-10-30 10:41:13
6402
修改2023-10-30 10:41:13
举报
文章被收录于专栏:《项目实战教学》

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

前言

  在软件开发过程中,我们常会遇到需要创建不同对象的情况,但是很多时候客户端并不需要关心对象的具体创建过程,只需要得到一个可以处理业务逻辑的对象。在这种情况下,使用简单工厂模式可以让客户端无需了解对象的创建细节,只需要向工厂请求所需对象即可。

摘要

  简单工厂模式属于创建型模式,它提供了一种创建对象的方式,将对象的创建过程封装在工厂中,客户端只需要调用工厂的创建方法即可得到所需对象。简单工厂模式可以根据传入参数的不同返回不同的对象实例,这种方式属于静态工厂方法,因为它使用了静态方法来创建对象。

简单工厂模式

设计原则

  简单工厂模式是实现其他设计模式的基础,不仅能够让客户端更方便地获取所需对象,并且有利于解耦,提高代码的灵活性和可维护性。简单工厂模式的设计原则如下:

  • 单一职责原则:工厂类负责对象的创建,客户端只负责向工厂请求对象。
  • 开闭原则:简单工厂模式可以根据需要添加新的产品类,同时不需要修改工厂类代码,符合开闭原则。
  • 依赖倒置原则:客户端只依赖于工厂类,不依赖于具体产品类。

工厂角色

  • 工厂角色是简单工厂模式的核心,负责实现简单工厂模式的创建过程。
  • 工厂角色主要包含一个 createProduct() 方法,用来创建具体产品角色的实例对象。

抽象产品角色

  • 抽象产品角色是具体产品角色的父类,定义了具体产品角色所需的方法。具体产品角色
  • 具体产品角色是工厂角色所创建的对象。
  • 具体产品角色实现了抽象产品角色中所定义的方法。

结构

简单工厂模式包含以下几个角色:

  1. 工厂类(Factory):负责创建所有产品的实例,并且提供一个可以根据参数创建不同产品的方法。
  2. 抽象产品类(Product):定义了产品的通用属性和行为。
  3. 具体产品类(ConcreteProduct):实现了抽象产品类的接口,并且定义了具体产品的属性和行为。

如下是简单工厂模式的UML类图:

简单工厂模式UML类图
简单工厂模式UML类图

应用场景

简单工厂模式适用于需要根据不同的参数来创建不同的对象的情况,例如:

  1. 当一个类的实例化对象需要根据传入参数不同而有不同表现时,可以使用简单工厂模式,例如创建一些数据库的连接对象。
  2. 当需要在代码中动态指定使用哪个实现类时,可以使用简单工厂模式,例如选择生成不同的图形对象。
  3. 当需要对外隐藏实例化对象的细节,只提供一个简单的接口供外部调用时,可以使用简单工厂模式,例如创建自定义的日志系统。

总之,当需要根据不同情况生成不同的对象时,使用简单工厂模式可以更方便、灵活地进行对象的创建。

优缺点

  简单工厂模式是一种创建型设计模式,它将对象的创建过程封装在一个工厂类中,使得客户端无需知道具体的创建过程,只需要告诉工厂类需要什么对象即可。其优缺点如下:

优点:

使用简单工厂模式的优点包括:

  1. 对象的创建过程被封装在工厂类中,客户端无需关心对象创建的细节,降低了客户端的复杂度。
  2. 工厂类可以根据需要动态地创建对象,客户端可以随时根据需要获取不同的对象。
  3. 工厂类可以统一管理对象的创建,使得客户端不容易出现重复创建相同的对象的代码,提高了代码的可维护性和代码复用性。缺点:使用简单工厂模式的缺点包括:
  4. 工厂类负责创建所有对象,当需要创建的对象种类过多时,工厂类的代码会变得非常复杂。
  5. 工厂类需要了解每个对象创建时的具体细节,如果需要添加一个新的对象,就需要修改工厂类的代码,这违反了开放-封闭原则。
  6. 工厂模式中的对象是通过工厂类创建的,无法直接创建对象,这使得代码的可读性不高。

模式实现

  如下便通过Java代码实现一个简单地工厂模式,同学们认真看,其中的模式是如何运转的,演示如下:

定义抽象产品类

  定义一个抽象产品类,其中定义一个无返回值的抽象方法execute();在简单工厂模式中,该接口通常代表着由工厂生产出的产品。所有具体的产品类都需要实现该接口,并且实现该接口的方法。

代码语言:java
复制
package com.example.javaDesignPattern.simpleFactory;

/**
 * 抽象产品类
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 15:36
 */
public interface Product {
    void execute();
}

  简单工厂模式的核心思想是将对象的创建过程封装在一个工厂类中,客户端只需要通过传递不同的参数,就可以获得不同的产品实例。这样,客户端和具体产品的耦合就可以降低,同时也方便了产品的扩展和维护。

  整个简单工厂模式中,抽象产品类Product是一个非常重要的组成部分。通过定义抽象产品类,可以将具体产品类的共性进行抽象,使得客户端能够更加方便的使用不同的产品,同时也保证了产品的可扩展性和可维护性。

定义具体产品类

定义一个产品类:ConcreteProductA

代码语言:java
复制
package com.example.javaDesignPattern.simpleFactory;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 15:36
 */
public class ConcreteProductA implements Product {
    @Override
    public void execute() {
        System.out.println("执行具体产品A的方法");
    }
}

定义一个产品类:ConcreteProductB

代码语言:java
复制
package com.example.javaDesignPattern.simpleFactory;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 15:37
 */
public class ConcreteProductB implements Product {
    @Override
    public void execute() {
        System.out.println("执行具体产品B的方法");
    }
}

代码解读:

  抽象产品类 Product 定义了所有具体产品类(如 ConcreteProductAConcreteProductB)所需实现的方法。具体产品类则用于实现这些方法。

在该示例中,ConcreteProductAConcreteProductB 分别实现了 execute() 方法以输出不同的信息。

定义工厂类

代码语言:java
复制
package com.example.javaDesignPattern.simpleFactory;

/**
 * 工厂类
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 15:41
 */
public class Factory {
    public static Product createProduct(String type) {
        //根据传入的参数type的不同来创建不同的产品对象。
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        } else {
            throw new IllegalArgumentException("Unknown product type: " + type);
        }
    }
}

代码解读:

  如上代码展现了一个简单的工厂模式的实现,通过一个静态方法createProduct,根据传入的参数type的不同来创建不同的产品对象,返回的是一个Product类型的实例对象。具体实现是通过if-else语句来判断传入参数的类型,然后返回相应类型的ConcreteProduct实例对象。如果传入的类型不是A或B,会抛出一个IllegalArgumentException异常。工厂模式可以帮助我们封装对象的创建过程,避免直接使用new关键字来创建对象,降低代码的耦合度。

测试用例

  下面是使用简单工厂模式的测试用例,客户端只需要调用工厂的创建方法即可获取所需对象:

代码语言:java
复制
package com.example.javaDesignPattern.simpleFactory;

/**
 * 客户端
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/9/18 15:42
 */
public class Client {

    public static void main(String[] args) {
        Product productA = Factory.createProduct("A");
        Product productB = Factory.createProduct("B");

        productA.execute();
        productB.execute();
    }
}

根据如上测试用例执行结果如下:

执行结果
执行结果

代码解读:

  在这个例子中,工厂类 Factory,它负责根据参数创建具体的产品类对象。这些产品类都实现了同一个接口 Product,对外提供了 execute 方法。Client 类是客户端类,它通过工厂类创建了两个不同的产品对象 productAproductB,并调用它们的 execute 方法。

  工厂模式的作用是将产品的创建和使用分离,客户端只需要知道需要什么类型的产品,而不需要知道具体的实现细节。这样做的好处是,当需要修改产品实现时,只需要修改工厂类的代码即可,客户端不受影响。同时,工厂模式也可以避免客户端直接依赖具体的产品类,降低了代码的耦合度,提高了代码的可维护性和扩展性。

小结

  本文主要介绍了简单工厂模式的基本概念和代码实现。简单工厂模式通过工厂角色的创建过程将对象的创建交给工厂类来实现,这样可以简化对象的创建过程。

附录源码

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

总结

  简单工厂模式是工厂模式的一种,它通过一个工厂类,来根据用户提供的参数,创建产品类的实例。这种模式将对象的创建和使用分离,用户只需要知道需要什么产品即可,无需了解产品的创建细节。简单工厂模式的优点在于简单、易于管理和扩展,但是缺点也很明显——增加新的产品需要修改工厂类的逻辑。因此,在实际开发中,我们需要根据具体的场景来选择使用哪种工厂模式。

☀️建议/推荐你

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

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • 简单工厂模式
    • 设计原则
      • 工厂角色
        • 抽象产品角色
          • 结构
            • 应用场景
              • 优缺点
                • 优点:
              • 模式实现
                • 定义抽象产品类
                • 定义具体产品类
                • 定义工厂类
              • 测试用例
                • 小结
                  • 附录源码
                  • 总结
                  • ☀️建议/推荐你
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档