授课语音

建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它通过使用多个简单的对象一步步构建一个复杂的对象。建造者模式允许客户端只通过指定复杂对象的类型和内容就能构建一个复杂的对象,而无需关注对象的构建细节。


1. 建造者模式的应用场景

建造者模式适用于以下几种场景:

  1. 对象的构建过程比较复杂:当对象的构建过程涉及多个步骤或有复杂的初始化过程时,建造者模式可以将这些步骤分离出来,使得对象的构建过程更加清晰。

  2. 需要通过多个不同的方式创建一个对象:有时我们可能需要不同的构建方式来创建相同类型的对象。建造者模式提供了一种灵活的方式来创建对象,避免客户端需要知道具体构建细节。

  3. 对象的构建需要依赖多个参数:当一个对象的构建需要多个参数并且这些参数之间可能有顺序关系时,使用建造者模式可以使代码更加清晰,避免使用过多的构造函数或“长参数列表”。

  4. 对象的创建与使用分离:当对象的创建与使用过程需要解耦,或者当一个对象的构建过程中包含了多个步骤,而这些步骤可能需要按不同的顺序执行时,建造者模式特别有效。

实际应用场景

  • 餐厅点餐:点餐的过程需要不同的步骤,例如选择菜品、选择饮料、选择配菜等。每种餐品的选择和组合方式不同,建造者模式可以帮助餐厅通过统一的点餐流程来构建订单。
  • 汽车制造:汽车的制造过程涉及多个步骤,如选择车身、发动机、轮胎等。每个客户的需求不同,可以通过建造者模式创建不同配置的汽车。

2. 建造者模式的结构

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

  1. Product(产品类):表示最终建造的复杂对象。
  2. Builder(抽象建造者):定义了创建产品对象的各个部分的接口。
  3. ConcreteBuilder(具体建造者):实现了Builder接口,构建并组装各个部分,最后返回组装好的对象。
  4. Director(指挥者):负责控制建造过程,指挥具体建造者按顺序构建产品。

3. 建造者模式的优点

  • 高内聚、低耦合:建造者模式可以将复杂对象的构建过程和使用过程分离,客户端只需要关心最终产品,而不需要关心产品的构建细节。
  • 灵活性高:建造者模式可以通过改变不同的构建方式来创建不同的产品,符合开闭原则。
  • 易于扩展:如果有新的产品需要构建,只需增加新的具体建造者类,不影响其他代码。

4. Java代码实现

下面是一个简单的建造者模式实现:假设我们要构建一个Computer对象,用户可以根据需求选择不同的配置项。

4.1 产品类(Computer)

public class Computer {
    private String CPU;
    private String RAM;
    private String storage;
    private String GPU;

    public void setCPU(String CPU) {
        this.CPU = CPU;
    }

    public void setRAM(String RAM) {
        this.RAM = RAM;
    }

    public void setStorage(String storage) {
        this.storage = storage;
    }

    public void setGPU(String GPU) {
        this.GPU = GPU;
    }

    @Override
    public String toString() {
        return "Computer [CPU=" + CPU + ", RAM=" + RAM + ", Storage=" + storage + ", GPU=" + GPU + "]";
    }
}

4.2 抽象建造者(Builder)

public abstract class ComputerBuilder {
    protected Computer computer = new Computer();

    public abstract void buildCPU();
    public abstract void buildRAM();
    public abstract void buildStorage();
    public abstract void buildGPU();

    public Computer getResult() {
        return computer;
    }
}

4.3 具体建造者(ConcreteBuilder)

public class GamingComputerBuilder extends ComputerBuilder {

    @Override
    public void buildCPU() {
        computer.setCPU("Intel i9");
    }

    @Override
    public void buildRAM() {
        computer.setRAM("32GB");
    }

    @Override
    public void buildStorage() {
        computer.setStorage("1TB SSD");
    }

    @Override
    public void buildGPU() {
        computer.setGPU("NVIDIA RTX 3080");
    }
}

4.4 指挥者(Director)

public class Director {
    private ComputerBuilder builder;

    public Director(ComputerBuilder builder) {
        this.builder = builder;
    }

    public Computer construct() {
        builder.buildCPU();
        builder.buildRAM();
        builder.buildStorage();
        builder.buildGPU();
        return builder.getResult();
    }
}

4.5 客户端代码(Client)

public class Client {
    public static void main(String[] args) {
        ComputerBuilder builder = new GamingComputerBuilder(); // 创建具体建造者
        Director director = new Director(builder); // 创建指挥者

        Computer computer = director.construct(); // 通过指挥者构建对象
        System.out.println(computer); // 输出构建好的计算机
    }
}

代码解读:

  1. Computer:定义了产品类,包含了不同的配置项(CPU、RAM、Storage、GPU)以及相应的set方法。
  2. ComputerBuilder:抽象建造者类,定义了构建产品的各个步骤(buildCPUbuildRAMbuildStoragebuildGPU),并提供一个getResult方法获取最终构建的产品。
  3. GamingComputerBuilder:具体建造者类,按照特定的配置来构建一台游戏电脑。
  4. Director:指挥者类,负责按照顺序调用具体建造者类的方法来构建复杂对象。
  5. Client:客户端代码,负责调用建造者模式来创建对象,并打印最终结果。

5. 总结

建造者模式适用于创建复杂对象时,特别是当对象的构建过程需要涉及多个步骤或者有多个可选配置时。它通过将对象的构建过程和使用过程解耦,提供了更高的灵活性和可扩展性。在Java中,使用建造者模式能够让代码更加清晰、简洁,并且易于维护。

去1:1私密咨询

系列课程: