建造者模式
1.定義:
將一個復(fù)雜對象的構(gòu)建與它的表示分離其监,使得同樣的構(gòu)建過程可以創(chuàng)建出不同的表示。
2.使用場景:
- 相同的方法缀台,不同的執(zhí)行順序棠赛,產(chǎn)生不同的事件結(jié)果時;
- 當初始化一個對象特別復(fù)雜,如參數(shù)多睛约,且很多參數(shù)都具有默認值時鼎俘;
- 產(chǎn)品類非常復(fù)雜,或產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的作用辩涝。
3.UML圖
4.詳解:
Builder模式是一步一步創(chuàng)建一個復(fù)雜對象的創(chuàng)建型模式贸伐,它允許用戶在不知道內(nèi)部構(gòu)建細節(jié)的情況下,可以更精細的控制對象的構(gòu)造流程怔揩。該模式是為了將構(gòu)建復(fù)雜對象的過程與它的部件解耦捉邢,使得構(gòu)建過程和部件的表示分離開來。
下面用代碼舉例闡述商膊,首先是產(chǎn)品類與產(chǎn)品的組裝接口:
public static class Computer {
private String mCpu;
private String mMainBoard;
private String mRam;
public void setmCpu(String mCpu) {
this.mCpu = mCpu;
}
public void setmMainBoard(String mMainBoard) {
this.mMainBoard = mMainBoard;
}
public void setmRam(String mRam) {
this.mRam = mRam;
}
@Override
public String toString() {
return mCpu + "==" + mMainBoard + "==" + mRam;
}
}
public interface ComputerBuilder {
void buildCpu(String cpu);
void buildMainBoard(String mainBoard);
void buildRam(String ram);
Computer create();
}
然后是具體的組裝實現(xiàn)類:
public static class ConcreteBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildCpu(String cpu) {
computer.setmCpu(cpu);
}
@Override
public void buildMainBoard(String mainBoard) {
computer.setmMainBoard(mainBoard);
}
@Override
public void buildRam(String ram) {
computer.setmRam(ram);
}
@Override
public Computer create() {
return computer;
}
}
接著就是關(guān)鍵的組裝類了伏伐,即產(chǎn)品組裝過程:
public static class Director {
private ComputerBuilder builder;
public Director(ComputerBuilder builder) {
this.builder = builder;
}
public Computer createComputer(String cpu, String mainBoard, String ram) {
builder.buildCpu(cpu);
builder.buildMainBoard(mainBoard);
builder.buildRam(ram);
return builder.create();
}
}
測試代碼:
public static void main(String[] args) {
ComputerBuilder builder = new ConcreteBuilder();
Director cBuilder = new Director(builder);
Computer computer = cBuilder.createComputer("i7-6700", "酷睿i7", "驍龍800");
System.out.println(computer.toString());//輸出結(jié)果:i7-6700==酷睿i7==驍龍800
}