定義:
將一個(gè)復(fù)雜的構(gòu)建和它的表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
角色:
在一個(gè)標(biāo)準(zhǔn)的建造者模式中有這幾個(gè)角色:
1、抽象建造者(Builder):為創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定抽象接口。
2、具體建造者(ConcreteBuilder):實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,并提供一個(gè)檢索產(chǎn)品的接口。
3、設(shè)計(jì)者或指導(dǎo)者(Director):構(gòu)造一個(gè)使用Builder接口的對(duì)象,指導(dǎo)構(gòu)建過(guò)程。
4、產(chǎn)品(Product):表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程,包含定義組成部件的類(lèi),包括將這些部件裝配成最終產(chǎn)品的接口。
以建造房子為例說(shuō)下建造者模式,很多時(shí)候建造房子或者房子裝修,消費(fèi)者首先找的是設(shè)計(jì)師,設(shè)計(jì)師將圖紙?jiān)O(shè)計(jì)出來(lái)后,再去找到相應(yīng)的工人去施工,工人安裝消費(fèi)者和設(shè)計(jì)師的圖紙將房子建造好并交付給消費(fèi)者。
大致流程圖:

定義出消費(fèi)者心中的房子,也就是產(chǎn)品,需要建造什么樣子的房子;
產(chǎn)品(Product):
/**
* 需要建造的房子類(lèi)
* 首先要描述下房子要建造什么,建造成什么樣子
*
* Created by Administrator on 2017/10/8.
*/
public class House {
private String window;
private String floor;
public String getWindow() {
return window;
}
public String getFloor() {
return floor;
}
public void setWindow(String window) {
this.window = window;
}
public void setFloor(String floor) {
this.floor = floor;
}
}
設(shè)計(jì)師根據(jù)房屋消費(fèi)者的需求設(shè)計(jì)出相應(yīng)的圖紙,但是設(shè)計(jì)師并不進(jìn)行相應(yīng)的建造,而是將圖紙給工人指導(dǎo)工人建造房子;
設(shè)計(jì)者或指導(dǎo)者(Director):
/**
* 指導(dǎo)者
* 對(duì)于建造房子而言就相當(dāng)對(duì)設(shè)計(jì)師
* 設(shè)計(jì)師將設(shè)計(jì)好的房屋圖紙給具體的工人進(jìn)行建造
* Created by Administrator on 2017/10/8.
*/
public class Designer {
public void order(Build build){
//建造地板
build.makeFloor();
//建造窗戶
build.makeWindow();
}
}
根據(jù)產(chǎn)品定義出產(chǎn)品對(duì)象各個(gè)部件的接口,即抽象建造者;
抽象建造者(Builder):
/**
* 建造者角色
* 工人接口,定義了工人所需要進(jìn)行的各項(xiàng)工作,并不具體負(fù)責(zé)建造房子
*
*同時(shí)房子是具體的工人(農(nóng)民工)進(jìn)行建造,需要返回房子的方法
* Created by Administrator on 2017/10/8.
*/
public interface Build {
/**
* 建造窗戶
*/
public void makeWindow();
/**
* 建造地板
*/
public void makeFloor();
/**
* 獲取建造的房子對(duì)象
* @return 返回對(duì)應(yīng)的房子對(duì)象
*/
public House getHouse();
}
定義對(duì)應(yīng)的接口實(shí)現(xiàn)類(lèi),也就是具體的房屋建造者--工人,不過(guò)工人要按照設(shè)計(jì)師(指導(dǎo)者)的設(shè)計(jì)圖紙進(jìn)行建造;
具體建造者(ConcreteBuilder):
/**
* 房屋的具體建造者
* Created by Administrator on 2017/10/8.
*/
public class WorkBuilder implements Build{
private House house=new House();
@Override
public void makeWindow() {
house.setWindow("建造窗戶完成");
}
@Override
public void makeFloor() {
house.setFloor("建造地板完成");
}
@Override
public House getHouse() {
return house;
}
}
工人將房子建造好后,房屋消費(fèi)者就可以得到房子了;
/**
* 需求建造房子的消費(fèi)者
* Created by Administrator on 2017/10/8.
*/
public class Client {
public void main(){
//找到設(shè)計(jì)師
Designer designer=new Designer();
//設(shè)計(jì)師將設(shè)計(jì)好的圖紙交個(gè)工人進(jìn)行施工
WorkBuilder workBuilder=new WorkBuilder();
designer.order(workBuilder);
//工人將房子建好后給消費(fèi)者
House house = workBuilder.getHouse();
Log.e("TAG",house.getWindow()+house.getFloor());
}
}
以上就是一個(gè)標(biāo)準(zhǔn)的建造者模式,在實(shí)際項(xiàng)目中,很多的建造者模式的運(yùn)用都是做了相應(yīng)的變化的;也用建造房屋為例,對(duì)建造者模式做相應(yīng)變化并運(yùn)用。
產(chǎn)品(Product):
/**
* 需要建造的房子類(lèi)
* 首先要描述下房子要建造什么,建造成什么樣子
* Created by Administrator on 2017/10/8.
*/
public class House {
private String window;
private String floor;
public void apply(WorkBulder.HouseParmas parmas){
this.window=parmas.window;
this.floor=parmas.floor;
}
@Override
public String toString() {
return window+floor;
}
}
具體建造者(ConcreteBuilder):
/**
* 具體的房子建造者
* Created by Administrator on 2017/10/8.
*/
public class WorkBulder {
private HouseParmas parmas;
public WorkBulder(){
this.parmas=new HouseParmas();
}
public WorkBulder makeWindow(String window){
parmas.window=window;
return this;
}
public WorkBulder makeFloor(String floor){
parmas.floor= floor;
return this;
}
public House builder(){
House house=new House();
house.apply(parmas);
return house;
}
class HouseParmas{
public String window;
public String floor;
}
}
調(diào)用:
WorkBulder workBulder=new WorkBulder();
House builder = workBulder.makeFloor("建造地板").makeWindow("建造窗戶").builder();
Log.e("TAG",builder.toString());
上面就是變化后的建造者模式,和標(biāo)準(zhǔn)的建造模式相比少了 抽象建造者(Builder)和設(shè)計(jì)者或指導(dǎo)者(Director) 這兩個(gè)角色;這種變化后的建造者模式在項(xiàng)目開(kāi)發(fā)中式碰到比較多的,系統(tǒng)的AlertDialog、glide等很多都是采用變化后的建造者模式。