【设计模式】建造者模式

建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。

这意味着客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。

在这里插入图片描述

建造者模式的结构通常包括以下几个关键部分:

  1. Director(指导者):负责指导构建过程的顺序,它并不直接创建产品,而是通过建造者来构建产品。指导者与抽象建造者之间存在关联关系,可以在其构造方法或方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。
  2. Builder(抽象建造者):定义了创建产品各个部分的抽象接口,一般声明两类方法,一类方法是用于创建复杂对象的各个部件,另一类方法是用于返回复杂对象。Builder 既可以是抽象类,也可以是接口。
  3. ConcreteBuilder(具体建造者):实现了 Builder 接口,负责具体产品的构建过程,定义并明确所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品对象。
  4. Product(产品):表示最终构建出的复杂对象,它通常包含了多个部分。

JAVA实现案例

建造者模式适用于构建具有复杂配置的对象,例如具有多个可选组件的汽车、电脑等。其优点在于建造者独立,易扩展,便于控制细节风险;缺点是产品必须有共同点,范围有限制,如内部变化复杂,会有很多的建造类。在实际应用中,如 Java 中的 StringBuilder 就是建造者模式的体现。通过将复杂对象的构建过程进行封装,使用建造者模式可以提高代码的可维护性和可扩展性,使得构建复杂对象的过程更加清晰和可控。

建造者模式在实际软件中的应用案例

在实际的软件设计中,建造者模式有诸多应用场景。例如,在汽车制造领域,一辆汽车由发动机、底盘、车身、内饰等多个复杂部件组成。通过建造者模式,我们可以将汽车的各个部件的构建过程与最终的装配过程分离。抽象建造者定义了创建汽车部件的接口,具体建造者负责实现具体部件的创建,指挥者则协调各个部件的构建和装配顺序,从而实现不同配置和型号的汽车生产。

再比如在软件开发中,构建复杂的用户界面时也能应用建造者模式。一个用户界面可能包含多个元素,如菜单、工具栏、状态栏、主窗口内容等。抽象建造者规定了创建这些界面元素的方法,具体建造者实现具体元素的创建,指挥者负责按照特定顺序和规则将这些元素组合成完整的用户界面。

在数据库操作中,构建复杂的查询语句也可以使用建造者模式。抽象建造者定义了构建查询条件、连接表、排序规则等部分的接口,具体建造者实现具体的构建逻辑,指挥者根据业务需求协调这些部分的组合,最终生成符合要求的查询语句。

Director 在建造者模式中的作用原理

Director(指挥者)在建造者模式中扮演着重要的角色。它主要有两个关键作用:

  • 其一,它隔离了客户与复杂的生产过程。客户无需直接了解产品的具体构建细节,只需要与指挥者进行交互,指定所需的产品类型和相关配置。这使得客户的操作更加简洁和直观,降低了客户的使用难度和出错概率。

  • 其二,Director 负责控制产品的生成过程。它决定了产品各部分的构建顺序、哪些部分需要构建以及如何进行组装。通过精心设计的指挥流程,Director 能够确保产品的构建过程高效、准确,并符合特定的业务规则和需求。

例如,在构建一个复杂的软件系统时,Director 可以根据不同的场景和需求,灵活地安排各个模块的构建顺序和组合方式。又比如在制造复杂的工业产品时,Director 可以根据订单要求,指挥建造者按照特定的规格和工艺来生产产品。

Builder 接口的设计要点

Builder 接口的设计是建造者模式的关键之一。在设计 Builder 接口时,需要明确以下几个要点:

  • 首先,接口中应清晰定义创建产品各个部分的方法。这些方法要具有明确的职责和功能,以便具体的建造者能够准确地实现。例如,如果要构建一个房屋对象,Builder 接口可能包含创建地基、墙壁、屋顶等部分的方法。

  • 其次,接口中的方法应该具有良好的可扩展性。随着业务的发展和需求的变化,可能需要添加新的部件构建方法。因此,在设计时要预留扩展的空间,避免因新增部件而导致接口的大幅修改。

  • 另外,Builder 接口还应该考虑到参数的合理性和灵活性。方法的参数应该能够准确传递构建部件所需的信息,同时又不过于复杂,以保证使用的便利性。

  • 最后,Builder 接口要定义一个获取最终构建结果的方法。这个方法能够将各个部分组合成完整的产品并返回,以便客户端获取和使用。

例如,在设计一个文档生成器的 Builder 接口时,可以包含设置文档标题、正文内容、字体样式等方法,同时提供一个获取完整文档对象的方法。

在这里插入图片描述

如何优化建造者模式中的 Director 和 Builder 协作

为了优化建造者模式中 Director 和 Builder 的协作,可以从以下几个方面入手:

  • 一是明确职责分工。确保 Director 专注于控制构建流程和顺序,而 Builder 专注于具体部件的构建。避免职责不清导致的混乱和效率低下。

  • 二是优化通信机制。建立高效、简洁的通信方式,使 Director 能够准确地向 Builder 传达构建需求和指令,Builder 能够及时向 Director 反馈构建进度和问题。

  • 三是引入缓存和复用机制。对于一些常见的构建过程或已经构建好的部件,可以进行缓存和复用,以提高构建效率。

  • 四是进行性能优化。例如,对构建过程中的耗时操作进行优化,或者采用并行构建的方式提高构建速度。

  • 五是增强灵活性。支持动态调整构建流程和部件配置,以适应不同的业务需求和变化。

比如,在一个大型系统的构建中,可以根据系统的负载情况动态调整构建的并行度;或者在构建过程中,根据用户的实时需求动态更改产品的某些部件配置。


Java代码实现

以下是一个使用 Java 实现建造者模式的示例,用于构建一个Computer对象:

class Computer {

    private String cpu;
    private String ram;
    private String hardDisk;

    // 构造函数私有化,防止外部直接创建对象
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.hardDisk = builder.hardDisk;
    }

    // 获取属性的方法
    public String getCpu() {
        return cpu;
    }

    public String getRam() {
        return ram;
    }

    public String getHardDisk() {
        return hardDisk;
    }

    // 静态内部类Builder
    public static class Builder {

        private String cpu;
        private String ram;
        private String hardDisk;

        // 设置 CPU 的方法
        public Builder setCpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        // 设置内存的方法
        public Builder setRam(String ram) {
            this.ram = ram;
            return this;
        }

        // 设置硬盘的方法
        public Builder setHardDisk(String hardDisk) {
            this.hardDisk = hardDisk;
            return this;
        }

        // 构建 Computer 对象的方法
        public Computer build() {
            return new Computer(this);
        }
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", ram='" + ram + '\'' +
                ", hardDisk='" + hardDisk + '\'' +
                '}';
    }
}

public class BuilderPatternExample {
    public static void main(String[] args) {
        Computer computer = new Computer.Builder()
              .setCpu("Intel Core i7")
              .setRam("16GB")
              .setHardDisk("1TB SSD")
              .build();

        System.out.println(computer);
    }
}

在上述代码中:

  • Computer类是要构建的产品类,它有cpuramhardDisk等属性。

  • Builder是一个静态内部类,用于逐步设置Computer对象的属性,并提供build方法来构建最终的Computer对象。

  • Director的角色在这个示例中体现得不是很明显,在实际场景中,如果有对构建过程的更复杂控制逻辑,可以单独创建一个类来充当Director的角色。

实现案例2


复习

一、建造者模式(Builder Pattern)的定义

建造者模式是一种创建对象的设计模式,它将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

在建造者模式中,有一个导演(Director)类和一个建造者(Builder)抽象类及其具体的建造者子类。导演类负责控制构建产品的流程,而具体的建造者子类负责实现产品的具体构建过程。

在这里插入图片描述

二、建造者模式的意义和解决的问题

  1. 分离对象的构建和表示

    • 使得构建复杂对象的代码更加清晰、易读和可维护。当一个对象的构建过程非常复杂,涉及多个步骤和多种配置时,如果将这些构建逻辑直接放在对象的构造函数中,会使构造函数变得庞大且难以理解和维护。使用建造者模式,可以将构建逻辑分离到不同的建造者类中,使每个类专注于自己的构建任务。
  2. 支持对象的灵活构建

    • 可以根据不同的需求创建具有不同内部表示的对象。例如,在构建一个汽车对象时,可以有不同的建造者来创建经济型汽车、豪华型汽车等,它们的构建过程和配置可能不同,但最终都能得到一个完整的汽车对象。
  3. 更好的控制构建过程

    • 导演类可以精确地控制对象的构建步骤和顺序,确保对象的构建过程按照预期进行。这对于需要严格遵循一定流程和规则来构建对象的场景非常有用。

三、深层次的哲学意义

从哲学角度来看,建造者模式体现了以下几个方面的思考:

  1. 分工与协作

    • 建造者模式将对象的构建过程分解为不同的角色(导演和建造者),每个角色专注于自己的职责,通过协作完成对象的构建。这反映了在复杂系统中,分工与协作是提高效率、保证质量和实现复杂功能的重要方式。
  2. 解耦与分离

    • 将对象的构建过程与对象的表示分离,体现了一种解耦的思想。在现实世界中,事物的生产过程和最终形态往往是可以分离的,这种分离可以使生产过程更加灵活、可扩展,并且便于对生产过程进行优化和改进。
  3. 变化与稳定

    • 导演类控制着稳定的构建流程,而不同的建造者可以根据需求进行变化和扩展,以构建出不同的对象。这体现了在变化的需求和环境中,寻找稳定的架构和流程,同时又能够灵活地适应变化的哲学思想。

总之,建造者模式在软件设计中不仅是一种解决对象构建问题的技术手段,还蕴含了对系统设计、分工协作、解耦分离和应对变化等方面的深刻思考和实践指导。

——

【完】

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值