當一個產品的構建過程是固定且複雜多變的,則可以將該產品的構建過程抽象出來。
從一個簡單的例子出發
比如:組裝一臺電腦,你一定需要有CPU、主板、內存、硬盤以及IO外設。而每個部分你都可以選擇不同的類型:CPU可以是Arm或者Intel,內存可以是臺電的或是三星的等等。
這樣的話,如果將構建電腦的過程抽象出來,就可以如下表示:
public abstract class ComputerBuilder{
public abstract void buildCPU();
public abstract void buildMemory();
public abstract void buildIO();
public abstract Product getProduct();
}
而產品可以簡單表示爲:
public class Computer {
String memory;
String IO;
String CPU;
@Override
public String toString() {
// TODO Auto-generated method stub
return “memory:”+memory+"\n"+“IO:”+IO+"\n"+“CPU:”+CPU;
}
}
這個時候如果Dell需要生產一臺電腦就會這樣做:
public class DellComputerBuilder extends ComputerBuilder{
private Computer DellComputer = new Computer();
@Override
public void buildCPU() {
// TODO Auto-generated method stub
DellComputer.CPU = "dellCPU";
}
@Override
public void buildMemory() {
// TODO Auto-generated method stub
DellComputer.IO = "dellIO";
}
@Override
public void buildIO() {
// TODO Auto-generated method stub
DellComputer.memory = "dellMemory";
}
@Override
public Computer getProduct() {
// TODO Auto-generated method stub
buildCPU();
buildIO();
buildMemory();
return DellComputer;
}
}
最後經銷商director將負責把產品賣出:
public class Director {
private ComputerBuilder computerBuilder;
public Director(ComputerBuilder cb) {
this.computerBuilder = cb;
}
public Computer getComputer() {
return computerBuilder.getProduct();
}
}
這四個類的關係大致如下:
image
與工廠模式(模板工廠、抽象工廠)的區別和聯繫
我們可以看到整個建造者模式是一個特別強調產品構建過程的設計模式,而工廠模式則更加強調了產品的種類。
事實上,上面的例子我特地給出了DellComputer,這說明Computer完全可以作爲一個抽象產品類出現,從而滿足不同類型的builder。這些builder完全可以是聯想、華碩等等。
而在經銷商看來,只要你的產品沒有缺失(都含有CPU、Memory、IO),那麼經銷商就完全不必去關心電腦怎麼組裝的,也不用關心是哪個廠家生產的。經銷商只需要告訴客戶一件事,那就是我賣的是Computer。而客戶需要哪種Computer,只需要告訴經銷商即可。