1.概念
建造者设计模式(Builder Design Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.作用
用于简化对复杂对象的创建
3.应用场景
当我们有一个非常复杂的对象(属性很多)需要创建并初始化,传统的创建方法有两种:
使用有参构造器一次完成创建与初始化操作
使用构造器完成创建工作,使用set方法完成初始化操作
但上面两个方法都会有相同的问题——代码量太大,可读性差。
所以这个时候我们可以使用建造者模式。
4.特点
对象的构建过程与表示分离
5.类与对象关系
有以下角色:
- 产品:我们实际要创建和使用的复杂对象
- 抽象建造者:一个用来约束具体建造者的接口
- 具体建造者:实际完成对象的初始化操作
- 指挥者(可选):提供一些默认情况下的初始化配置
6.实现
假设我们现在要创建一个产品——Computer
它包含四个主要部分:CPU、RAM、存储(storage)和GPU。
Computer类(产品)和builder内部类(建造者)
// 产品类:Computer
public class Computer {private String cpu;private String ram;private String storage;private String gpu;// 私有构造方法,防止外部直接实例化private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.storage = builder.storage;this.gpu = builder.gpu;}// 内部静态Builder类(建造者)public static class Builder {private String cpu;private String ram;private String storage;private String gpu;// 设置CPUpublic Builder setCpu(String cpu) {this.cpu = cpu;return this;}// 设置RAMpublic Builder setRam(String ram) {this.ram = ram;return this;}// 设置存储public Builder setStorage(String storage) {this.storage = storage;return this;}// 设置GPUpublic Builder setGpu(String gpu) {this.gpu = gpu;return this;}// 构建Computer对象public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return ("Computer{" +"cpu='" +cpu +'\'' +", ram='" +ram +'\'' +", storage='" +storage +'\'' +", gpu='" +gpu +'\'' +'}');}
}
该例子中,我们可以看出:
- 我们不能直接为Computer类的属性进行赋值,而是使用builder为其赋值
- 在builder中进行赋值后从builder中取出值传递给Computer类,来完成初始化
- 使用Builder类的各个set方法设置完属性后,使用build方法构建出对象
Director类(指挥者)(可选)
// 指挥者类(可选)
public class ComputerDirector { private Computer.Builder builder; public ComputerDirector(Computer.Builder builder) { this.builder = builder; } // 示例构建方法 public Computer constructGamingComputer() { return builder .setCpu("Intel i9") .setRam("32GB") .setStorage("1TB SSD") .setGpu("NVIDIA RTX 3080") .build(); } // 其他构建方法可以根据需要添加
}
指挥者类在这个例子中不是必须的,这里只是用来提供一些默认配置,让我们能更快的创建并初始化出一个对象
测试类
public class Main { public static void main(String[] args) { // 使用Builder直接构建 Computer gamingComputer = new Computer.Builder() .setCpu("Intel i7") .setRam("16GB") .setStorage("512GB SSD") .setGpu("NVIDIA RTX 3070") .build(); System.out.println(gamingComputer); // 使用Director构建(可选) ComputerDirector director = new ComputerDirector(new Computer.Builder()); Computer highEndComputer = director.constructGamingComputer(); System.out.println(highEndComputer); }
}
正常使用建造者模式,我们需要使用Builder对象进行赋值,然后最终使用build方法创建对象。
使用指挥者后,因为里面已经有默认配置,所以可以直接创建出对象,更高效。