• 创建者模式(Builder Pattern):构造复杂对象的通用解决方案


    一、技术背景与应用场景

    创建者模式是一种对象创建型设计模式,它通过将复杂的构建过程与表示分离,使得相同的创建过程可以创建不同的表示。这种模式在面对具有多个可选组成部分和多种组合方式的对象时尤为有用,如配置文件生成、复杂查询语句构造、产品装配等。

    为何使用创建者模式?

    1. 隐藏复杂性:当一个类有多个构造参数或初始化步骤比较复杂时,使用创建者模式可以避免暴露过多的构造器参数。
    2. 重用代码:不同类型的复杂对象可以通过共享相同的创建逻辑来实现代码重用。
    3. 灵活性:可以灵活地改变产品内部结构,而无需修改客户端代码。

    典型应用场景包括但不限于:

    • 复杂的对象构建:如创建具有多种配置选项的产品实例。
    • XML 或 JSON 解析:根据输入数据动态构建对象树。
    • SQL 查询构造:根据用户需求拼接出复杂的 SQL 语句。

    二、创建者模式定义与结构

    创建者模式包含以下核心组成部分

    在这里插入图片描述

    1. Product(产品接口):声明产品的接口,这里通常是一个抽象类或者接口,定义了产品的共有属性和方法。
    2. ConcreteProduct(具体产品):实现了 Product 接口的具体产品类。
    3. Builder(抽象建造者):声明了一系列用于构建最终产品的操作,并声明了一个返回最终产品的方法 getResult
    4. ConcreteBuilder(具体建造者):继承自 Builder,实现了所有声明的构建方法,负责按顺序创建并组装产品的各个部分。
    5. Director(导演类):独立于具体建造者的角色,负责调用建造者的方法来控制产品的创建过程。

    三、使用步骤举例

    假设我们要构建一个简单的电脑配置类(Computer),它包含CPU、内存、硬盘等多个组成部分,而这些组成部分有不同的选择。为了更好地封装构建过程,我们将使用创建者模式来设计代码。

    1. Computer 是抽象产品,定义了所有电脑配置共有的属性和行为。

      // 抽象产品 - 电脑配置
      public abstract class Computer {
          protected String cpu;
          protected String ram;
          protected String hardDisk;
      
          public String getCpu() {
              return cpu;
          }
      
          public String getRam() {
              return ram;
          }
      
          public String getHardDisk() {
              return hardDisk;
          }
      
          // 抽象方法用于展示配置详情
          public abstract void display();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    2. GamingComputer 是具体产品,继承自抽象产品并实现了具体的配置细节。

      // 具体产品 - 高端游戏电脑配置
      public class GamingComputer extends Computer {
          public GamingComputer(String cpu, String ram, String hardDisk) {
              super();
              this.cpu = cpu;
              this.ram = ram;
              this.hardDisk = hardDisk;
          }
      
          @Override
          public void display() {
              System.out.println("Gaming Computer Configuration:");
              System.out.println("CPU: " + cpu);
              System.out.println("RAM: " + ram);
              System.out.println("Hard Disk: " + hardDisk);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    3. ComputerBuilder 是抽象建造者,声明了用来构建电脑配置的各项基本操作。

      // 抽象建造者 - 电脑配置建造者
      public abstract class ComputerBuilder {
          protected Computer computer;
      
          public abstract void buildCpu();
          public abstract void buildRam();
          public abstract void buildHardDisk();
      
          // 返回最终的产品
          public Computer getComputer() {
              return computer;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    4. GamingComputerBuilder 是具体建造者,通过覆盖抽象建造者中的方法,为高端游戏电脑配置具体的硬件组件。

      // 具体建造者 - 高端游戏电脑配置建造者
      public class GamingComputerBuilder extends ComputerBuilder {
          public GamingComputerBuilder() {
              computer = new GamingComputer("", "", "");
          }
      
          @Override
          public void buildCpu() {
              computer.cpu = "Intel Core i9-12900K";
          }
      
          @Override
          public void buildRam() {
              computer.ram = "32GB DDR5 RAM";
          }
      
          @Override
          public void buildHardDisk() {
              computer.hardDisk = "1TB NVMe SSD";
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    5. 在客户端代码中,通过调用具体建造者的构建方法,一步步构建出所需的具体产品,并最终展示其配置信息。

      // 客户端代码
      public class Client {
          public static void main(String[] args) {
              // 创建具体建造者对象
              ComputerBuilder builder = new GamingComputerBuilder();
      
              // 按照流程构建电脑配置
              builder.buildCpu();
              builder.buildRam();
              builder.buildHardDisk();
      
              // 获取构建完成的电脑配置对象
              Computer gamingComputer = builder.getComputer();
      
              // 显示电脑配置信息
              gamingComputer.display();
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

    测试结果

    在这里插入图片描述

    四、优缺点分析

    创建者模式的优点在于:

    1. 封装性与解耦:创建者模式将复杂对象的构造过程与表示分离,客户端无需了解具体的构建细节,只需指定需要的产品类型或配置参数。这增强了系统的封装性和模块间的解耦。

    2. 产品一致性:创建者模式确保了无论何时通过建造者创建的产品,其内部结构都是一致的。即使在复杂的构建过程中,也能保持产品的完整性。

    3. 扩展性良好:当产品类增加新的属性或行为时,只需要修改相应的建造者类即可,不影响已有的代码和使用该模式的客户端代码。

    4. 便于并行构造:由于创建过程被分步实现,因此在某些情况下,可以并行执行各部分的构建工作,提高系统性能。

    潜在挑战可能包括:

    1. 类数量增多:引入创建者模式后,会增加抽象建造者、具体建造者以及可选的指挥者等多个类,导致类的数量增多,一定程度上增加了系统的复杂性。

    2. 过度设计:如果产品的构建过程并不复杂或者变化较少,强制使用创建者模式可能会造成设计上的过度复杂化。

    3. 理解和调试难度:对于包含多个具体建造者的大型系统,理解各个建造者之间的关系和作用可能较为困难,特别是当建造过程涉及多层嵌套调用时,调试起来也可能较为复杂。

    总结

    ​ 创建者模式通过将构建过程与表示分离,使得客户端只需关注构建过程本身而不必关心具体产品的内部构造细节。这不仅提高了系统的灵活性和可扩展性,也使代码更加清晰易读,降低了模块间的耦合度。然而,过度使用创建者模式可能导致类数量增多,应合理评估是否真正需要创建者模式来处理对象的创建过程。

  • 相关阅读:
    视频太长怎么批量分割、提取封面图片的
    一键接入 ChatGPT,让你的QQ群变得热闹起来
    如何使用做一个弹幕效果
    正规现货黄金中的MACD技术
    openssl之中文手册
    最高薪14.5K!转行软件测试面临就业难?修炼内功才是破局之道
    基于Java的捐赠平台
    模型压缩常用方法简介
    电子技术论坛
    通过WordCount案例深入理解MapReduce的实现过程
  • 原文地址:https://blog.csdn.net/CAUC_lin/article/details/136248263