建造者(Builder)模式也被称为生成器模式,创建型模式是主要是为了解决对象的创建的方式,相较于单态则是为了保证创建的对象的唯一性问题,建造者模式是为了解决复杂对象的创建,尤其是子对象的构建过程存在顺序和逻辑关系的时候。
模式场景与说明
比如对象由多个复杂的子对象组成的情况,多个对象组成的方式一般较为稳定,但是子对象的创建过程可能会发生变化,根据OCP原则,可以考虑对子对象的创建过程进行封装。
实现方式
一个通用创建型模式的使用可能会有如下部分组成:
组成部分 | 类型 | 作用 |
---|---|---|
Product | 类 | 创建的内容 |
Builder | 接口 | 包含返回Product的build或者composite方法 |
ConcreteBuilder | 具体建造类 | 实现了Builder接口的具体建造类,此类在加载时会创建一个Product对象 |
Director | 调配类 | 一般此类的构建函数包含Builder类型的参数,通过此类提供统一的调配,包括顺序和逻辑,简单场景下可以不需要此类的存在 |
示例概要
代码示例
// Product
class Computer {
private String cpu;
private String memory;
private String graphics;
private String motherboard;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setMemory(String memory) {
this.memory = memory;
}
public void setGraphics(String graphics) {
this.graphics = graphics;
}
public void setMotherboard(String motherboard) {
this.motherboard = motherboard;
}
@Override
public String toString(){
return "Computer information: \n"
+ "CPU: " + this.cpu + "\n"
+ "Memory: " + this.memory + "\n"
+ "Graphics: " + this.graphics + "\n"
+ "Motherboard: " + this.motherboard;
}
}
interface Builder {
void buildMotherboard(String motherboard);
void buildGraphics(String graphics);
void buildCpu(String cpu);
void buildMemory(String memory);
Computer build();
}
class ConcreteBuilder implements Builder {
private Computer computer = new Computer();
@Override
public void buildMotherboard(String motherboard){
this.computer.setMotherboard(motherboard);
}
@Override
public void buildGraphics(String graphics){
this.computer.setGraphics(graphics);
}
@Override
public void buildCpu(String cpu) {
this.computer.setCpu(cpu);
}
@Override
public void buildMemory(String memory){
this.computer.setMemory(memory);
}
@Override
public Computer build(){
return this.computer;
}
}
class Director {
private Builder builder = null;
Director(Builder builder) { this.builder = builder; }
Computer buildComputer(String motherboard, String graphics, String cpu,String memory) {
this.builder.buildMotherboard(motherboard);
this.builder.buildGraphics(graphics);
this.builder.buildCpu(cpu);
this.builder.buildMemory(memory);
return this.builder.build();
}
}
public class BuilderTest {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Computer computer = director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3");
System.out.print(computer);
}
}
执行结果为:
Computer information:
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 1536 MB
Motherboard: 820-00xxx
但是需要注意此模式解决的问题和Factory不同,因此它是在具体建造类的加载期间就生成了Product的实例,可结合如下示例代码进行进一步的思考
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Computer computer = director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3");
System.out.println(computer);
Computer computer2 = director.buildComputer("830-00xxx", "Intel Iris Pro 3032 MB","2.5 GHz Quad-Core Intel Core i7","32 GB 1600 MHz DDR3");
System.out.println(computer2);
System.out.println(computer);
执行结果如下所示
Computer information:
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 1536 MB
Motherboard: 820-00xxx
Computer information:
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 32 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 3032 MB
Motherboard: 830-00xxx
Computer information:
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 32 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 3032 MB
Motherboard: 830-00xxx