也稱(chēng)為:生成器模式
定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者模式通用類(lèi)圖:

在建造者模式中通常有四個(gè)角色:
①Product產(chǎn)品類(lèi):通常是實(shí)現(xiàn)了模板方法模式,也就是有模板方法與基本方法。
②Builder抽象建造者:規(guī)范產(chǎn)品的組建,由其子類(lèi)實(shí)現(xiàn)。
③ConcreteBuilder子類(lèi)建造者:實(shí)現(xiàn)抽象建造者的方法,并返回一個(gè)組建好的對(duì)象。
④Director導(dǎo)演類(lèi):起到封裝作用,避免高層模塊深入到建造者內(nèi)部的實(shí)現(xiàn)類(lèi),負(fù)責(zé)安排已有模塊的組建,然后告訴Builder開(kāi)始建造,可以有多個(gè)導(dǎo)演類(lèi)。
問(wèn)題重現(xiàn):
現(xiàn)在需要建造車(chē)輛模型,車(chē)有:?jiǎn)?dòng)(start),停止(stop),喇叭(alarm),引擎啟動(dòng)(engineBoom)四種行為,現(xiàn)在需要根據(jù)用戶需求,自定義這四種行為,并生產(chǎn)對(duì)應(yīng)的車(chē)輛模型。
(1)產(chǎn)品抽象類(lèi)
public abstract class CarModel {
//記錄自定義車(chē)輛模型的行為順序
private ArrayList<String> abstractArrayList = new ArrayList<>();
//車(chē)輛啟動(dòng)行為
protected abstract void start();
//車(chē)輛停止行為
protected abstract void stop();
//車(chē)輛響喇叭行為
protected abstract void alarm();
//車(chē)輛引擎發(fā)動(dòng)行為
protected abstract void engineBoom();
//模型方法,啟動(dòng)車(chē)輛
final public void run(){
//根據(jù)定義好的行為順序啟動(dòng)汽車(chē)行為
for (int i = 0; i<abstractArrayList.size();i++){
if (Objects.equals(abstractArrayList.get(i),"start")){
this.start();
}
if (Objects.equals(abstractArrayList.get(i),"stop")){
this.stop();
}
if (Objects.equals(abstractArrayList.get(i),"alarm")){
this.alarm();
}
if (Objects.equals(abstractArrayList.get(i),"engineBoom")){
this.engineBoom();
}
}
}
//在抽象類(lèi)中完成傳遞用戶定義好的順序
protected void setArrayList(ArrayList arrayList){
this.abstractArrayList = arrayList;
}
}
(2)產(chǎn)品實(shí)現(xiàn)類(lèi)
public class BMWCar extends CarModel{
//子類(lèi)重寫(xiě)基本方法
@Override
protected void start() {
System.out.println("start 開(kāi)始");
}
@Override
protected void stop() {
System.out.println("stop 開(kāi)始");
}
@Override
protected void alarm() {
System.out.println("alarm 開(kāi)始");
}
@Override
protected void engineBoom() {
System.out.println("engineBoom 開(kāi)始");
}
}
經(jīng)過(guò)上述兩部分,已經(jīng)將產(chǎn)品類(lèi)的模板方法與基本方法完成。
(3)抽象建造者
public abstract class CarBuilder {
//根據(jù)用戶提供的模塊順序搭建汽車(chē)
abstract CarModel getCar(ArrayList<String> arrayList);
}
(4)具體的子類(lèi)建造者
public class BMWCarBuilder extends CarBuilder {
@Override
CarModel getCar(ArrayList<String> arrayList) {
BMWCar bmwCar = new BMWCar();
bmwCar.setArrayList(arrayList);
return bmwCar;
}
}
(5)導(dǎo)演類(lèi)
public class Director {
private ArrayList<String> abstractArrayList = new ArrayList<>();
private BMWCarBuilder bmwCarBuilder = new BMWCarBuilder();
public BMWCar getBMWCar( ){
//清理集合數(shù)據(jù),防止數(shù)據(jù)混亂
this.abstractArrayList.clear();
abstractArrayList.add("start");
abstractArrayList.add("stop");
abstractArrayList.add("alarm");
return (BMWCar) bmwCarBuilder.getCar(abstractArrayList);
}
}
------------output--------------
start 開(kāi)始
stop 開(kāi)始
alarm 開(kāi)始
經(jīng)過(guò)上述代碼,用戶可以在導(dǎo)演類(lèi)中自定義車(chē)輛模型的行為順序,然后建造對(duì)應(yīng)的車(chē)輛模型。
建造者模式的優(yōu)點(diǎn):
①封裝性。
②建造者獨(dú)立,擴(kuò)展方便。
③由于建造者是獨(dú)立的,可以對(duì)建造過(guò)程進(jìn)行細(xì)化,便于控制細(xì)節(jié)風(fēng)險(xiǎn),且不會(huì)對(duì)其他模塊造成影響。
建造者模式的使用場(chǎng)景:
①相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果。
②多個(gè)部件組裝到一個(gè)對(duì)象中,運(yùn)行結(jié)果不同時(shí)。
建造者模式的注意點(diǎn):
建造者模式注重零件類(lèi)型和裝配工藝順序,而不是注重創(chuàng)建對(duì)象;工廠方法模式注重的是部件或?qū)ο蟮膭?chuàng)建,組裝順序并不是它所關(guān)心的。
參考書(shū)籍:設(shè)計(jì)模式之禪 --- 秦小波 著