简介
建造者模式是一种创建型设计模式,将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示,该模式适用于创建具有复杂内部结构的对象,特别是当对象的组成部分不变但组合方式经常变化时
平时,如果我们需要创建一个对象,通常使用new 的方式,传参进入构造函数中调用字段的set方法或直接通过对象.set方法来创建对象的字段细节,这种方式对于简单对象使用没什么问题,但对于一个对象中动辄几十个字段以上的对象来说,这就太麻烦了, 并且由于业务的复杂程度,对象内部字段的组合也是千变万化,使得需要定义特别多的构造函数,或在代码中进行set,容易错漏,并且不够优雅
传统方式:构造函数爆炸

传统方式:setter方法(对象状态可能不一致)

静态内部建造者
静态内部建造者方式是一种非常简单并且简洁的建造者模式,有利于我们理解建造者模式,我们创建一个Computer 类,将cpu,memory,storage三个字段由private final修饰,这样可以确保对象创建之后外部无法直接访问和修改字段(即便有set方法也没用,demo中有举例),然后将构造方法私有化,防止客户端直接实例化对象,确保只能通过建造者创建,最后再创建一个静态内部建造者Builder ,此时我们就可以在建造者Builder中构建具体的部件,实例化时new Computer.Builder()后根据链式编程逐步完善细节,这样一来,我们可以将复杂的构建逻辑或者检验等封装到在Builder中统一处理,修改构建逻辑只需调整建造者类
java
// 产品类 - 电脑
class Computer {
private final String cpu;
private final String memory;
private final String storage;
// 私有构造函数,只能通过建造者创建
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.memory = builder.memory;
this.storage = builder.storage;
}
// 静态内部建造者类
public static class Builder {
private String cpu;
private String memory;
private String storage;
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder setMemory(String memory) {
this.memory = memory;
return this;
}
public Builder setStorage(String storage) {
this.storage = storage;
return this;
}
public Computer build() {
return new Computer(this);
}
}
// Getter方法
public String getCpu() { return cpu; }
public void setCpu(String cpu) { return cpu; }
public String getMemory() { return memory; }
public String getStorage() { return storage; }
@Override
public String toString() {
return "Computer [CPU: " + cpu + ", Memory: " + memory + ", Storage: " + storage + "]";
}
}
// 演示类
class BuilderPatternDemo {
public static void main(String[] args) {
// 使用建造者创建电脑对象
Computer gamingComputer = new Computer.Builder()
.setCpu("Intel i9")
.setMemory("32GB DDR5")
.setStorage("2TB NVMe SSD")
.build();
Computer officeComputer = new Computer.Builder()
.setCpu("Intel i5")
.setMemory("16GB DDR4")
.setStorage("512GB SSD")
.build();
System.out.println("游戏电脑配置: " + gamingComputer);
System.out.println("办公电脑配置: " + officeComputer);
//由于字段被final修饰,即便给出set方法进行设置,也无法改变
officeComputer.setCpu("00.1纳米");
System.out.println("办公电脑配置,重新设置CPU值为00.1纳米之后: " + officeComputer);
System.out.println("由于字段被final修饰,无法更改");
}
}

常规建造者模式:
现在我们来看上面的改造为常规建造者模式后的代码,实际上就是将Computer 类中的静态建造者提了出来成为单独的建造类,依然承担主要建造责任,依然封装具体建造细节,在此基础上,还可以将建造类改造为抽象接口,定义抽象建造方法,然后由多个具体建造类实现,从而实现进一步扩展
java
// 产品类 - 电脑
class Computer {
private final String cpu;
private final String memory;
private final String storage;
// 公有构造函数,接受建造者对象
public Computer(ComputerBuilder builder) {
this.cpu = builder.cpu;
this.memory = builder.memory;
this.storage = builder.storage;
}
// Getter方法
public String getCpu() { return cpu; }
public String getMemory() { return memory; }
public String getStorage() { return storage; }
@Override
public String toString() {
return "Computer [CPU: " + cpu + ", Memory: " + memory + ", Storage: " + storage + "]";
}
}
// 独立的建造者类
class ComputerBuilder {
protected String cpu;
protected String memory;
protected String storage;
public ComputerBuilder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public ComputerBuilder setMemory(String memory) {
this.memory = memory;
return this;
}
public ComputerBuilder setStorage(String storage) {
this.storage = storage;
return this;
}
public Computer build() {
return new Computer(this);
}
}
// 演示类
class BuilderPatternDemo {
public static void main(String[] args) {
// 使用独立的建造者类创建电脑对象
ComputerBuilder builder = new ComputerBuilder();
Computer gamingComputer = builder
.setCpu("Intel i9")
.setMemory("32GB DDR5")
.setStorage("2TB NVMe SSD")
.build();
Computer officeComputer = new ComputerBuilder()
.setCpu("Intel i5")
.setMemory("16GB DDR4")
.setStorage("512GB SSD")
.build();
System.out.println("游戏电脑配置: " + gamingComputer);
System.out.println("办公电脑配置: " + officeComputer);
// 验证配置信息
System.out.println("游戏电脑CPU: " + gamingComputer.getCpu());
System.out.println("办公电脑内存: " + officeComputer.getMemory());
}
}

建造者模式与工厂模式的区别:
工厂模式 :好比一个汽车品牌(如丰田)的4S店
你去丰田4S店说:"我要买一辆凯美瑞。"
销售员回答:"好的。"
过了一会儿,他直接交给你一辆标准配置、组装完毕的凯美瑞汽车。
特点:你关注的是最终产品(一辆凯美瑞)。你不需要关心这辆车是怎么组装起来的(是先装发动机还是先装车门),你只告诉工厂你想要什么型号,它就给你一个完整的、标准化的产品。
核心:生产产品。
建造者模式 :好比一个高端汽车定制工坊
你去劳斯莱斯定制中心说:"我要造一辆幻影。"
然后你和工程师(建造者)一步步确定细节:
工程师问:"车身要什么颜色?" 你答:"曜石黑。"
工程师问:"内饰要真皮还是天鹅绒?" 你答:"牛津真皮。"
工程师问:"轮毂要20寸还是22寸?" 你答:"22寸锻造轮毂。"
工程师问:"要星空顶吗?" 你答:"要。"
工程师根据你的每一步选择,逐步将这辆幻影搭建起来。最终,你得到了一辆完全按照你的个性化规格组装起来的劳斯莱斯幻影。
特点:你关注的是建造过程和细节配置。你通过一系列步骤和选择,指导建造者如何创建这个复杂对象。同一个建造过程(造幻影),因为配置不同,会产出不同的最终产品。
核心:组装产品。
上一篇 >>>>> 设计模式之工厂模式