建造者模式宿稀,主要用來構(gòu)建復(fù)雜的對(duì)象(變量很多的對(duì)象)。如臺(tái)式電腦赖捌,它包括主板祝沸、內(nèi)存條、CPU還有機(jī)箱等各個(gè)部件越庇,而作為用戶罩锐,一般不關(guān)心這些部件是怎么裝配的唯欣,也幾乎不會(huì)單獨(dú)使用某個(gè)部件搬味,而是使用組裝好了的電腦。所以你只需要給建造者準(zhǔn)備好零部件萍聊,讓建造者給你建造出產(chǎn)品即可悦析。
一般的建造者模式,是使用如下圖的方式亭螟,一個(gè)導(dǎo)演Director持有一個(gè)抽象的Builder跑龍?zhí)椎脑だ樱珼irector調(diào)用自己的construct()命令跑龍?zhí)椎慕ㄔ飚a(chǎn)品Product道媚,construct()方法中是抽象的Builder在buildPart1()、buildPart2()谴分,導(dǎo)演不指定具體的龍?zhí)孜悖灰钟谐橄蟮腂uilder即可薄翅,龍?zhí)椎腷uildPart1()就是在組裝Product產(chǎn)品的具體參數(shù),因?yàn)锽uilder持有Product對(duì)象僧凰。
然而以上并不是Builder pattern的最佳實(shí)踐
如果按上面的套路來训措,那建造一個(gè)類簡(jiǎn)直要人命啊绩鸣,不僅要寫抽象接口,并且代碼不好閱讀化借。因此建造者模式有很多簡(jiǎn)單的變種蓖康,以下才是我認(rèn)為最好的建造者模式垒手,直接上代碼。
Computer這個(gè)產(chǎn)品中有一個(gè)專業(yè)的建造者Builder泳梆,Builder有一個(gè)方法build可以建造出一個(gè)Computer產(chǎn)品优妙,Computer構(gòu)造方法私有化套硼,只有Builder才能創(chuàng)建鼠哥。Builder中有多個(gè)方法接收外部給的零部件看政,等零部件集齊允蚣,Builder就可以調(diào)用build方法建造一臺(tái)Computer產(chǎn)品了。注意最好不要在Builder的構(gòu)造方法中new一個(gè)Computer森渐,而應(yīng)該在builder方法中new,因?yàn)锽uilder構(gòu)造方法執(zhí)行時(shí)竟块,Builder還沒接到零部件耐齐。
package builder;
/**
* 一臺(tái)電腦
*/
public class Computer {
private String mainBoard; // 主板
private String memory; // 內(nèi)存
private String cpu; // cpu
// 構(gòu)造函數(shù)私有化,不能直接new出一臺(tái)電腦耸携,因?yàn)殡娔X組裝很復(fù)雜夺衍,需要有專業(yè)技能的建造者來建造一臺(tái)電腦
private Computer(String mainBoard, String memory, String cpu){
this.mainBoard = mainBoard;
this.memory = memory;
this.cpu = cpu;
}
// 一般建造者模式為了易維護(hù)沟沙,都把builder設(shè)置為構(gòu)建產(chǎn)品的內(nèi)部靜態(tài)類
public static class Builder{
// 建造者需要的參數(shù)跟它所建造的產(chǎn)品一致
private String mainBoard; // 主板
private String memory; // 內(nèi)存
private String cpu; // cpu
// Builder構(gòu)造函數(shù)不能私有,他需要來接受零部件
public Builder(){
}
// Builder接收到零部件后尝胆,存到自己身上含衔,方法都放回Builder自身
public Builder setMainBoard(String mainBoard){
this.mainBoard = mainBoard;
return this;
}
public Builder setMemory(String memory){
this.memory = memory;
return this;
}
public Builder setCpu(String cpu){
this.cpu = cpu;
return this;
}
// 接收了所有零部件以后二庵,就可以build一個(gè)產(chǎn)品了
public Computer build(){
// 這里可以是一個(gè)復(fù)雜的建造Computer的流程催享,可能有對(duì)參數(shù)的一些校驗(yàn),這里就不寫了
Computer c = new Computer(this.mainBoard, this.memory, this.cpu);
return c;
}
}
@Override
public String toString() {
return "Computer{" +
"mainBoard='" + mainBoard + '\'' +
", memory='" + memory + '\'' +
", cpu='" + cpu + '\'' +
'}';
}
}
測(cè)試一下:
package builder;
public class BuilderMain {
public static void main(String[] args) {
Computer c = new Computer.Builder().setMainBoard("jijia")
.setCpu("Intel i7")
.setMemory("8g").build();
System.out.println(c);
}
}
測(cè)試成功痰憎,如下:
等等铣耘,上面代碼看起來是不是也很累蜗细,也需要寫大量的代碼,以下強(qiáng)烈推薦Lombok插件踪区,Idea創(chuàng)建springboot initial時(shí)可以把Lombok勾選上即可
使用了Lombok后吊骤,代碼如下白粉,只要一個(gè)@Builder就可以幫你搞定建造者模式。
然后客戶端直接調(diào)用即可或渤。