引言:Builder模式有“鏈?zhǔn)秸{(diào)用”、封裝對象構(gòu)建過程 的 作用。 這里直接用一個例子來說明吧。
Design Pattern -- Builder pattern
一、場景
如果你開了一家店,專門負(fù)責(zé)電腦組裝的,每一個客戶想要的電腦零件牌子和CPU等不一樣,你最終可以提供的成本電腦有:MacBookPro 等等。
二、設(shè)計 與 代碼
- 你需要提供一個平臺給客戶,客戶選擇要什么產(chǎn)品,你就生產(chǎn)什么給他們。所以 這個平臺【Director】是這樣的,他的內(nèi)部就是整個你的生產(chǎn)電腦的流程,每一部需要組裝什么類型的零件,定義好順序。
public class Director {
public static final String MAC_BOOK_PRO_13_i5 = "MAC_BOOK_PRO_13_i5";
public static final String MAC_BOOK_PRO_15_i7 = "MAC_BOOK_PRO_15_i7";
public Computer construct(String brand) {
ComputerBuilder computerBuilder = null;
if (MAC_BOOK_PRO_13_i5.equals(brand)) {
computerBuilder = new MacBookPro13i5Builder();
} else if (MAC_BOOK_PRO_15_i7.equals(brand)) {
computerBuilder = new MacBookPro15i7Builder();
}
return computerBuilder
.buildCpu()
.buildScreen()
.build();
}
}
- 那么,上面這個Builder又是啥呢?他就是你的各種成品組裝過程的細節(jié)定義類。你的Dell用什么CPU的,你用DellBuilder定義好,你的MBP用什么CPU的, 你用MacbookProBuilder 定義好,而當(dāng)然,可以抽象出這些共有的方法嘛。
public abstract class ComputerBuilder {
//設(shè)置屏幕等
public abstract ComputerBuilder buildScreen();
//設(shè)置cpu型號等
public abstract ComputerBuilder buildCpu();
///重要?。。∽罱K返回一個目的類對象實例
public abstract Computer build();
}
- 好,用于生產(chǎn)computer的機子抽象模型出來啦,但是,這個
computer目標(biāo)對象,我們還是得有的嘛。這時候我就想啦,不同的電腦,基本結(jié)構(gòu)都是那幾個的啦,CPU,OS等。。。so,抽象一個Computer抽象類。
public class Computer {
private String brand;
private String screen;
private String cpu;
private String os;
//............
}
- 好,現(xiàn)在,我們要造MacBookPro了,這時候,就需要用了子類
MacBookBuilder來鏈?zhǔn)蕉x我的MacBookPro需要的CPU型號、屏幕尺寸等屬性啦,至于操作系統(tǒng)嘛,那只能是MacOS 咯。
public class MacBookPro13i5Builder extends ComputerBuilder {
private Computer computer = new Computer();
{
computer.setBrand("MacBookPro");
computer.setOs("MacOS");
}
@Override
public ComputerBuilder buildScreen() {
this.computer.setScreen("Retina15寸");
return this;
}
@Override
public ComputerBuilder buildCpu() {
this.computer.setCpu("i7");
return this;
}
@Override
public Computer build() {
return this.computer;
}
}
public class MacBookPro15i7Builder extends ComputerBuilder {
private Computer computer = new Computer();
{
computer.setBrand("MacBookPro");
computer.setOs("MacOS");
}
@Override
public ComputerBuilder buildScreen() {
this.computer.setScreen("Retina13寸");
return this;
}
@Override
public ComputerBuilder buildCpu() {
this.computer.setCpu("i5");
return this;
}
@Override
public Computer build() {
return this.computer;
}
}

運行效果
