我們首先來看一下Builder模式的定義:23種設計模式之一,英文叫Builder Pattern。其核心思想是將一個“復雜對象的構建算法”與它的“部件及組裝方式”分離,使得構件算法和組裝方式可以獨立應對變化;復用同樣的構建算法可以創建不同的表示,不同的構建過程可以復用相同的部件組裝方式。
Builder模式目的將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
我們應該在以下情況使用Build模式:
1 當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
2 當構造過程必須允許被構造的對象有不同的表示時。
3 Builder模式要解決的也正是這樣的問題:
當我們要創建的對象很復雜的時候(通常是由很多其他的對象組合而成),
我們要復雜對象的創建過程和這個對象的表示(展示)分離開來,
這樣做的好處就是通過一步步的進行復雜對象的構建,
由于在每一步的構造過程中可以引入參數,使得經過相同的步驟創建最后得到的對象的展示不一樣。
沒有Builder模式的時候,是怎么樣寫代碼的?
舉個組裝電腦的例子來說明。有一臺電腦類,如下
public class Computer {
private String cpu;
private String motherboard;
private String displayCard;
private String ram;
private String disk;
private String power;
}
如果要組裝這樣一臺電腦,可以使用構造方法傳入參數列表,構建一個對象
public class Computer {
private String cpu;
private String motherboard;
private String displayCard;
private String ram;
private String disk;
private String power;
public Computer(String cpu, String motherboard, String displayCard, String ram, String disk, String power) {
this.cpu = cpu;
this.motherboard = motherboard;
this.displayCard = displayCard;
this.ram = ram;
this.disk = disk;
this.power = power;
}
}
但是參數列表的長度也太長了,看得都煩躁。而且,在使用構造 Computer 對象的時候,有可能暫時不需要傳入某些參數,比如目前只需要一個 CPU,那么就要重新寫一個構造方法,這樣也挺麻煩的。
public Computer(String cpu) {
this.cpu = cpu;
}
Builder模式解決的問題
要實現電腦配件的定制化,這個時候,就可以使用 Builder 模式。
在 Computer 類中寫一個 Builder 類,配件的裝備工作交由 Builder 來完成。
public class Computer {
private String cpu;
private String motherboard;
private String displayCard;
private String ram;
private String disk;
private String power;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setMotherboard(String motherboard) {
this.motherboard = motherboard;
}
public void setDisplayCard(String displayCard) {
this.displayCard = displayCard;
}
public void setRam(String ram) {
this.ram = ram;
}
public void setDisk(String disk) {
this.disk = disk;
}
public void setPower(String power) {
this.power = power;
}
public static class Builder {
private String cpu;
private String motherboard;
private String displayCard;
private String ram;
private String disk;
private String power;
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder setMotherboard(String motherboard) {
this.motherboard = motherboard;
return this;
}
public Builder setDisplayCard(String displayCard) {
this.displayCard = displayCard;
return this;
}
public Builder setRam(String ram) {
this.ram = ram;
return this;
}
public Builder setDisk(String disk) {
this.disk = disk;
return this;
}
public Builder setPower(String power) {
this.power = power;
return this;
}
public Computer create() {
Computer computer = new Computer();
if (cpu != null) {
computer.setCpu(cpu);
}
if (motherboard != null) {
computer.setMotherboard(motherboard);
}
if (displayCard != null) {
computer.setDisplayCard(displayCard);
}
if (ram != null) {
computer.setRam(ram);
}
if (disk != null) {
computer.setDisk(disk);
}
if (power != null) {
computer.setPower(power);
}
return computer;
}
}
}
組裝電腦的代碼如下
Computer computer = new Computer.Builder()
.setCpu("Intel Core i7")
.setMotherboard("GIGABYTE Z97")
.setDisplayCard("GTX Titan")
.setRam("32G")
.setDisk("2TB")
.setPower("1000W")
.create();
通過使用 Builder 模式,實現了對象的定制化構建,而且采用鏈式調用,方便了代碼編寫。