建造者(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