Skip to content

建造者模式 常用

建造者模式也称为生成器模式(Builder Pattern),将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

优缺点

优点缺点
创建与使用分离,客户端无需知道组装细节产生多余的 Builder 对象,增加内存开销
扩展性好,新增产品只需添加新的建造者类产品内部发生变化时,所有相关建造者都需要修改,维护成本较高
建造者间相互独立,一定程度解耦

适用场景

  • 对象参数多,且有大量可选参数
  • 创建步骤固定,但具体实现多样
  • 构建过程与产品表示需要分离

经典建造者

Java
// 产品:电脑
public class Computer {
    private String cpu;       // 必选
    private String ram;       // 必选
    private String storage;   // 可选
    private String gpu;       // 可选
    private String cooler;    // 可选

    // 私有构造,只有建造者能调用
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
        this.gpu = builder.gpu;
        this.cooler = builder.cooler;
    }

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

    // 静态内部类:建造者
    public static class Builder {
        private String cpu;
        private String ram;
        private String storage = "512GB SSD";   // 默认值
        private String gpu = "集成显卡";         // 默认值
        private String cooler = "风冷";          // 默认值

        // 必选参数通过构造传入
        public Builder(String cpu, String ram) {
            this.cpu = cpu;
            this.ram = ram;
        }

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

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

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

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

// 客户端使用
public class Client {
    public static void main(String[] args) {
        Computer gamingPC = new Computer.Builder("Intel i7", "16GB")
                .setStorage("1TB NVMe SSD")
                .setGpu("RTX 4070")
                .setCooler("水冷")
                .build();

        System.out.println(gamingPC);
    }
}

链式建造者

写法更简洁,不需要手动写内部 Builder 类,直接用 Lombok 注解或手动实现类似风格。

Java
// 产品:电脑(手动链式)
public class Computer {
    private String cpu;
    private String ram;
    private String storage;
    private String gpu;
    private String cooler;

    private Computer() {}

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {
        private Computer computer = new Computer();

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

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

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

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

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

        public Computer build() {
            return computer;
        }
    }

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

// 客户端使用
public class Client {
    public static void main(String[] args) {
        Computer gamingPC = Computer.builder()
                .cpu("Intel i7")
                .ram("16GB")
                .storage("1TB NVMe SSD")
                .gpu("RTX 4070")
                .cooler("水冷")
                .build();

        System.out.println(gamingPC);
    }
}

写法对比

对比项常规写法(静态内部类)链式写法
必选参数处理通过构造方法传入通过单独方法设置,无法强制
参数默认值在 Builder 中设置在 Builder 或产品类中设置
代码量较多较少
可读性清晰更直观
是否需导演类不需要不需要
是否支持 Lombok可手动实现Lombok @Builder 一键生成

如有转载或 CV 请标注本站原文地址