當(dāng)一個(gè)產(chǎn)品的構(gòu)建過程是固定且復(fù)雜多變的授嘀,則可以將該產(chǎn)品的構(gòu)建過程抽象出來(lái)。
從一個(gè)簡(jiǎn)單的例子出發(fā)
比如:組裝一臺(tái)電腦诫钓,你一定需要有CPU旬昭、主板、內(nèi)存菌湃、硬盤以及IO外設(shè)问拘。而每個(gè)部分你都可以選擇不同的類型:CPU可以是Arm或者Intel,內(nèi)存可以是臺(tái)電的或是三星的等等惧所。
這樣的話骤坐,如果將構(gòu)建電腦的過程抽象出來(lái),就可以如下表示:
public abstract class ComputerBuilder{
public abstract void buildCPU();
public abstract void buildMemory();
public abstract void buildIO();
public abstract Product getProduct();
}
而產(chǎn)品可以簡(jiǎn)單表示為:
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;
}
}
這個(gè)時(shí)候如果Dell需要生產(chǎn)一臺(tái)電腦就會(huì)這樣做:
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;
}
}
最后經(jīng)銷商director將負(fù)責(zé)把產(chǎn)品賣出:
public class Director {
private ComputerBuilder computerBuilder;
public Director(ComputerBuilder cb) {
this.computerBuilder = cb;
}
public Computer getComputer() {
return computerBuilder.getProduct();
}
}
這四個(gè)類的關(guān)系大致如下:
與工廠模式(模板工廠下愈、抽象工廠)的區(qū)別和聯(lián)系
我們可以看到整個(gè)建造者模式是一個(gè)特別強(qiáng)調(diào)產(chǎn)品構(gòu)建過程的設(shè)計(jì)模式纽绍,而工廠模式則更加強(qiáng)調(diào)了產(chǎn)品的種類。
事實(shí)上势似,上面的例子我特地給出了DellComputer拌夏,這說(shuō)明Computer完全可以作為一個(gè)抽象產(chǎn)品類出現(xiàn),從而滿足不同類型的builder履因。這些builder完全可以是聯(lián)想障簿、華碩等等。
而在經(jīng)銷商看來(lái)栅迄,只要你的產(chǎn)品沒有缺失(都含有CPU卷谈、Memory、IO)霞篡,那么經(jīng)銷商就完全不必去關(guān)心電腦怎么組裝的世蔗,也不用關(guān)心是哪個(gè)廠家生產(chǎn)的。經(jīng)銷商只需要告訴客戶一件事朗兵,那就是我賣的是Computer污淋。而客戶需要哪種Computer,只需要告訴經(jīng)銷商即可余掖。