设计模式-建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象的创建过程,并允许用户通过一步步的方式来生成对象。通过使用建造者模式,可以将对象的构造过程与它的表示分离,从而使得同样的构造过程可以创建不同的表示。


建造者模式的组成部分:

  1. 产品类(Product)
    • 要构建的复杂对象。
  2. 建造者接口(Builder)
    • 定义了构建产品各个部分的方法。
  3. 具体建造者(ConcreteBuilder)
    • 实现了 Builder 接口,负责构建具体的产品,并提供获取最终产品的方法。
  4. 指挥者(Director)
    • 负责管理建造过程,指导建造者一步步创建产品。
  5. 客户端(Client)
    • 使用指挥者与建造者生成所需的产品。

示例代码:构建电脑

问题背景

假设需要构建一台电脑,电脑由多个组件组成(如 CPU、内存、硬盘等)。不同配置的电脑需要用不同的构造过程,但最终生成的对象都是电脑。

实现代码

// 1. 产品类(Computer)
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. 抽象建造者(Builder)
interface ComputerBuilder {
    void buildCpu();
    void buildMemory();
    void buildStorage();
    void buildGpu();
    Computer getResult();
}

// 3. 具体建造者(ConcreteBuilder)
// 游戏电脑建造者
class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("高性能CPU");
    }

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

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

    @Override
    public void buildGpu() {
        computer.setGpu("高性能独立显卡");
    }

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

// 办公电脑建造者
class OfficeComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("经济型CPU");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("8GB内存");
    }

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

    @Override
    public void buildGpu() {
        computer.setGpu("集成显卡");
    }

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

// 4. 指挥者(Director)
class ComputerDirector {
    private ComputerBuilder builder;

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

    // 指导建造步骤
    public Computer construct() {
        builder.buildCpu();
        builder.buildMemory();
        builder.buildStorage();
        builder.buildGpu();
        return builder.getResult();
    }
}

// 5. 客户端(Client)
public class BuilderPatternExample {
    public static void main(String[] args) {
        // 构建游戏电脑
        ComputerBuilder gamingBuilder = new GamingComputerBuilder();
        ComputerDirector gamingDirector = new ComputerDirector(gamingBuilder);
        Computer gamingComputer = gamingDirector.construct();
        System.out.println("游戏电脑配置: " + gamingComputer);

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

输出结果

游戏电脑配置: Computer {CPU='高性能CPU', Memory='16GB内存', Storage='1TB SSD', GPU='高性能独立显卡'}
办公电脑配置: Computer {CPU='经济型CPU', Memory='8GB内存', Storage='512GB SSD', GPU='集成显卡'}

建造者模式的优点

  1. 封装性:将复杂对象的构建过程封装在具体建造者中,客户端无需关心具体的构建细节。
  2. 可扩展性:可以轻松地添加新的具体建造者以满足不同的需求。
  3. 易读性:通过指挥者可以直观地看到构建步骤和流程。

建造者模式的适用场景

  1. 需要构建复杂对象,并且对象的创建过程需要分步骤完成。
  2. 不同的配置组合需要生成不同的对象。
  3. 需要通过多种方式构造对象,但最终的产品具有相同的基本结构。

建造者模式广泛用于需要灵活构建复杂对象的场景,例如构建配置化的对象、生成器工具等。

posted @   庞某人  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示