设计模式-建造者模式

建造者模式是一种创建型设计模式,旨在将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它适用于以下场景:

  • 当对象的创建过程非常复杂,包含多个步骤或参数时。
  • 当需要创建的对象具有多个组成部分,且这些部分的组合方式可能不同时。
  • 当希望创建过程与对象的具体表示解耦时。

核心思想

建造者模式通过以下方式实现对象的创建:

  1. 将复杂对象的构建过程分解为多个步骤:每个步骤负责构建对象的一部分。
  2. 引入一个建造者类(Builder):负责定义构建步骤的接口,并实现具体的构建逻辑。
  3. 引入一个指挥者类(Director):负责控制构建过程的顺序,但不涉及具体的构建细节。
  4. 最终产品(Product):通过建造者模式构建的复杂对象。

通过这种方式,建造者模式将对象的构建过程与对象本身解耦,使得构建过程更加灵活和可扩展。

建造者模式的结构

建造者模式通常包含以下角色:

  • 产品(Product)
    最终要构建的复杂对象通,常包含多个组成部分。
  • 抽象建造者(Builder)
    定义构建产品的各个步骤的接口。通常包含多个方法,每个方法负责构建产品的一个部分。
  • 具体建造者(Concrete Builder)
    实现抽象建造者接口,提供具体的构建逻辑。负责创建和组装产品的各个部分。
  • 指挥者(Director)
    负责控制构建过程的顺序。调用建造者的方法,按照特定顺序构建产品。
  • 客户端(Client)
    创建指挥者和建造者对象,并通过指挥者构建最终产品。

建造者模式的优点

  • 分离构建过程与表示

    建造者模式将对象的构建过程与对象本身分离,使得构建过程更加灵活。

  • 易于扩展

    可以通过添加新的具体建造者来支持新的产品类型,而无需修改现有代码。

  • 更好的控制构建过程

    指挥者类可以精确控制构建过程的顺序和步骤。

  • 代码复用性高

    相同的构建过程可以用于创建不同的产品。

建造者模式的缺点

  • 增加了代码复杂性

    需要定义多个类(建造者、指挥者等),增加了系统的复杂性。

  • 适用于复杂对象

    如果对象构建过程非常简单,使用建造者模式可能会显得冗余。

建造者模式的应用场景

  1. 构建复杂对象

    例如,构建一个包含多个组成部分的电脑、汽车或房屋。

  2. 构建过程需要分步骤进行

    例如,生成一个包含多个步骤的文档或报告。

  3. 需要构建多个不同的表示

    例如,构建不同配置的电脑(游戏电脑、办公电脑等)。

建造者模式实现示例

以下是一个简单的建造者模式实现示例,假设我们要构建一个复杂的"电脑"对象,电脑由 CPU、内存、硬盘和显卡等部分组成。

(1)产品类(Product)

复制代码
public class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;
    private String gpu;

    // Setters and Getters
    public void setCpu(String cpu) { this.cpu = cpu; }
    public void setMemory(String memory) { this.memory = memory; }
    public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; }
    public void setGpu(String gpu) { this.gpu = gpu; }

    @Override
    public String toString() {
        return "Computer [cpu=" + cpu + ", memory=" + memory + ", hardDisk=" + hardDisk + ", gpu=" + gpu + "]";
    }
}

(2)抽象建造者类(Builder)

复制代码
public interface ComputerBuilder {
    void buildCpu();
    void buildMemory();
    void buildHardDisk();
    void buildGpu();
    Computer getResult();
}

(3)具体建造者类(Concrete Builder)

复制代码
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 buildHardDisk() {
        computer.setHardDisk("1TB SSD");
    }

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

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

(4)指挥者类(Director)

复制代码
public class ComputerDirector {
    private ComputerBuilder builder;

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

    public void construct() {
        builder.buildCpu();
        builder.buildMemory();
        builder.buildHardDisk();
        builder.buildGpu();
    }
}

(5)客户端代码(Client)

复制代码
public class Client {
    public static void main(String[] args) {
        // 创建具体建造者
        ComputerBuilder builder = new GamingComputerBuilder();
        // 创建指挥者
        ComputerDirector director = new ComputerDirector(builder);
        // 构建产品
        director.construct();
        // 获取最终产品
        Computer computer = builder.getResult();
        System.out.println(computer);
    }
}

建造者模式与工厂模式的区别

工厂模式:关注对象的创建,但不关心对象的构建过程。

建造者模式:关注对象的构建过程,特别是复杂对象的构建。

通过建造者模式,可以更好地管理和控制复杂对象的构建过程,使代码更加清晰和可维护。

相关推荐
艺杯羹2 分钟前
MyBatis之核心对象与工作流程及SqlSession操作
java·mybatis
神的孩子都在歌唱9 分钟前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
喜欢吃豆41 分钟前
深入企业内部的MCP知识(三):FastMCP工具转换(Tool Transformation)全解析:从适配到增强的工具进化指南
java·前端·人工智能·大模型·github·mcp
用户1551733938831 小时前
前后端处理 `multipart/form-data` 混合参数(实体对象+文件)方案
java
东阳马生架构1 小时前
订单初版—3.支付和履约链路中的技术问题说明文档
java
留不住丨晚霞1 小时前
说说SpringBoot常用的注解?
java·开发语言
华科云商xiao徐1 小时前
Java多线程爬虫动态线程管理实现
java·爬虫·数据挖掘
柒七爱吃麻辣烫2 小时前
八股文系列-----SpringBoot自动配置的流程
java·spring boot·rpc
M1A12 小时前
Java 面试系列第一弹:基础问题大盘点
java·后端·mysql
发仔1232 小时前
Dubbo介绍及示例用法
java·dubbo