5.建造者模式

发布于:2025-03-18 ⋅ 阅读:(13) ⋅ 点赞:(0)

建造者模式:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
核心思想:通过分步构建对象,避免构造函数参数过多,提高代码的可读性和灵活性。

假设你正在开发一个电脑定制系统,用户可以根据自己的需求选择不同的硬件配置(如CPU、内存、硬盘、显卡等)。电脑的配置组合非常复杂,如果使用传统的构造函数或Setter方法,会导致代码冗长且难以维护。建造者模式可以很好地解决这个问题。


1. 产品类 (Computer)

public class Computer {
    private String cpu;
    private String memory;
    private String storage;
    private String gpu;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

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

    public void setGpu(String gpu) {
        this.gpu = gpu;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", storage='" + storage + '\'' +
                ", gpu='" + gpu + '\'' +
                '}';
    }
}

2. 建造者接口 (ComputerBuilder)

public interface ComputerBuilder {
    void buildCpu();
    void buildMemory();
    void buildStorage();
    void buildGpu();
    Computer getComputer();
}

3. 具体建造者 (GamingComputerBuilderOfficeComputerBuilder)

游戏电脑建造者
public class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer;

    public GamingComputerBuilder() {
        this.computer = new Computer();
    }

    @Override
    public void buildCpu() {
        computer.setCpu("Intel i9");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("32GB DDR5");
    }

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

    @Override
    public void buildGpu() {
        computer.setGpu("NVIDIA RTX 4090");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}
办公电脑建造者
public class OfficeComputerBuilder implements ComputerBuilder {
    private Computer computer;

    public OfficeComputerBuilder() {
        this.computer = new Computer();
    }

    @Override
    public void buildCpu() {
        computer.setCpu("Intel i5");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("16GB DDR4");
    }

    @Override
    public void buildStorage() {
        computer.setStorage("512GB SSD");
    }

    @Override
    public void buildGpu() {
        computer.setGpu("Integrated GPU");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

4. 指挥者 (ComputerDirector)

public class ComputerDirector {
    private ComputerBuilder computerBuilder;

    public ComputerDirector(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public void constructComputer() {
        computerBuilder.buildCpu();
        computerBuilder.buildMemory();
        computerBuilder.buildStorage();
        computerBuilder.buildGpu();
    }

    public Computer getComputer() {
        return computerBuilder.getComputer();
    }
}

5. 客户端代码

public class ComputerBuilderDemo {
    public static void main(String[] args) {
        // 创建游戏电脑
        ComputerBuilder gamingBuilder = new GamingComputerBuilder();
        ComputerDirector gamingDirector = new ComputerDirector(gamingBuilder);
        gamingDirector.constructComputer();
        Computer gamingComputer = gamingDirector.getComputer();
        System.out.println("游戏电脑配置: " + gamingComputer);

        // 创建办公电脑
        ComputerBuilder officeBuilder = new OfficeComputerBuilder();
        ComputerDirector officeDirector = new ComputerDirector(officeBuilder);
        officeDirector.constructComputer();
        Computer officeComputer = officeDirector.getComputer();
        System.out.println("办公电脑配置: " + officeComputer);
    }
}

6. 输出

游戏电脑配置: Computer{cpu='Intel i9', memory='32GB DDR5', storage='1TB SSD', gpu='NVIDIA RTX 4090'}
办公电脑配置: Computer{cpu='Intel i5', memory='16GB DDR4', storage='512GB SSD', gpu='Integrated GPU'}

业务场景总结

  1. 问题:电脑配置复杂,直接使用构造函数或Setter方法会导致代码冗长且难以维护。

  2. 解决方案:使用建造者模式,将电脑的构建过程分解为多个步骤,并通过指挥者统一管理。

  3. 优点

    • 分离构建过程与表示,代码更清晰。

    • 支持灵活扩展,新增配置类型只需增加新的建造者。

    • 避免构造函数参数过多,提高代码可读性。


其他业务场景

  1. 订餐系统:用户可以选择不同的菜品组合(如主食、饮料、甜点),建造者模式用于构建订单。

  2. 文档生成:生成复杂的文档(如PDF、Word),建造者模式用于分步构建文档内容。

  3. 车辆制造:汽车的不同配置(如发动机、轮胎、内饰),建造者模式用于构建车辆对象。

建造者模式的核心思想是分步构建复杂对象,适用于需要灵活创建对象的场景。


网站公告

今日签到

点亮在社区的每一天
去签到