Java设计模式之建造者模式详解

Java设计模式之建造者模式详解


一、建造者模式核心思想

核心目标分离复杂对象的构建过程与表示,通过分步骤构造对象的方式,支持灵活配置不同参数组合,解决构造函数参数爆炸问题。


二、建造者模式类图(Mermaid)

创建
Director
-builder: Builder
+construct() : Product
«interface»
Builder
+buildPartA()
+buildPartB()
+getResult() : Product
ConcreteBuilder
-product: Product
+buildPartA()
+buildPartB()
+getResult() : Product
Product
+partA: String
+partB: int
+show() : void

三、模式核心角色

角色职责描述
Director指挥构建过程(可选角色)
Builder定义构建步骤的抽象接口
ConcreteBuilder实现具体构建逻辑
Product最终构建的复杂对象

四、代码实现示例

1. 基础实现版本

// 产品类
class Computer {
    private String cpu;
    private int ram;
    
    public void setCpu(String cpu) { this.cpu = cpu; }
    public void setRam(int ram) { this.ram = ram; }
    
    public void showSpecs() {
        System.out.println("CPU: " + cpu + ", RAM: " + ram + "GB");
    }
}

// 抽象建造者
interface ComputerBuilder {
    void buildCpu();
    void buildRam();
    Computer getResult();
}

// 具体建造者
class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    public void buildCpu() { computer.setCpu("Intel i9"); }
    public void buildRam() { computer.setRam(32); }
    public Computer getResult() { return computer; }
}

// 指挥者(可选)
class Director {
    public Computer construct(ComputerBuilder builder) {
        builder.buildCpu();
        builder.buildRam();
        return builder.getResult();
    }
}

// 客户端调用
ComputerBuilder builder = new GamingComputerBuilder();
Director director = new Director();
Computer computer = director.construct(builder);
computer.showSpecs();  // 输出: CPU: Intel i9, RAM: 32GB

2. 链式调用优化版(常用实践)

class Computer {
    private String cpu;
    private int ram;

    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
    }

    public static class Builder {
        private String cpu = "Intel i5";  // 默认值
        private int ram = 8;

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder ram(int ram) {
            this.ram = ram;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }
}

// 客户端调用
Computer computer = new Computer.Builder()
                            .cpu("AMD Ryzen 9")
                            .ram(64)
                            .build();

五、模式优缺点分析

✅ 优势

  • 参数灵活组合:避免构造方法参数爆炸(如20个参数的构造函数)
  • 构建过程可控:支持分步骤、按需构建对象
  • 代码可读性高:链式调用更符合自然语言习惯
  • 产品与构建解耦:相同构建过程可创建不同表示

❌ 缺点

  • 代码复杂度增加:需额外创建Builder类
  • 性能损耗:对象需经过多步构建过程

六、典型应用场景

  1. 复杂配置对象:如数据库连接配置(含超时时间、连接池大小等参数)
  2. 文档生成器:HTML/PDF文档的Header/Body/Footer分步构建
  3. 套餐组合:快餐店套餐(汉堡+饮料+配餐的自由组合)
  4. 游戏角色创建:逐步选择职业、装备、技能等属性

七、Mermaid序列图示例

Client Director Builder Product new ConcreteBuilder() construct(Builder) buildPartA() buildPartB() getResult() Product Product Client Director Builder Product

八、常见问题解答

Q1:建造者模式 vs 工厂模式?

对比维度建造者模式工厂模式
关注点分步骤构建复杂对象直接创建完整对象
使用场景对象包含多个组件需要组合对象创建逻辑简单
灵活性支持灵活配置不同参数组合固定类型的产品创建

Q2:何时需要Director角色?

  • 构建流程需要标准化时使用(如必须按A→B→C顺序构建)
  • 简单场景可直接通过客户端控制构建步骤

Q3:如何实现参数校验?

build()方法中添加校验逻辑:

public Computer build() {
    if (cpu == null) {
        throw new IllegalArgumentException("CPU不能为空");
    }
    return new Computer(this);
}

九、Lombok简化实现

使用@Builder注解自动生成建造者:

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
class Laptop {
    private String model;
    private int ssdSize;
    private boolean hasTouchScreen;
}

// 客户端调用
Laptop laptop = Laptop.builder()
                    .model("X1 Carbon")
                    .ssdSize(512)
                    .hasTouchScreen(true)
                    .build();

掌握建造者模式,可以优雅地解决复杂对象创建难题,让代码在扩展性和可读性之间达到完美平衡!

如果觉得文章对你有帮助,请帮忙点个关注吧,谢谢啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季鸢

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值