定義
將構(gòu)建復(fù)雜對(duì)象的過程和它的部件解耦,使構(gòu)建過程與部件的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示的創(chuàng)建型模式。
特點(diǎn)
Builder模式一步一步創(chuàng)建一個(gè)復(fù)雜對(duì)象,允許用戶在不知道內(nèi)部構(gòu)建細(xì)節(jié)的情況下,可以更精細(xì)地控制對(duì)象的構(gòu)造流程。
Builder是非線程安全的,所以如果要在Builder內(nèi)部類中檢查一個(gè)參數(shù)的合法性,必需要在對(duì)象創(chuàng)建完成之后再檢查。
應(yīng)用場景
初始化一個(gè)對(duì)象特別復(fù)雜,如參數(shù)多,且很多參數(shù)都具有默認(rèn)值時(shí);
復(fù)雜產(chǎn)品類中的調(diào)用順序不同產(chǎn)生不同的效能時(shí);
相同方法不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí);
角色
Product——產(chǎn)品類 :? 產(chǎn)品的抽象類。
Builder——抽象類, 規(guī)范產(chǎn)品的組建,一般是由子類實(shí)現(xiàn)具體的組件過程。
ConcreteBuilder——具體的構(gòu)建者。
Director——指揮者,統(tǒng)一組裝過程(可省略,Builder定義為Product的內(nèi)部類,ConcreteBuilder在Product子類中)。
模式代碼
/**
* 1.產(chǎn)品類
?* 如果有多個(gè)產(chǎn)品類則繼承該類,每個(gè)產(chǎn)品類有對(duì)應(yīng)的具體的建造者
*/
public class Product{ ??
????public void doSomething() {
? ? ? ? // 處理業(yè)務(wù) ?
? ? }
}
/**
* 2.抽象建造者
* 有多個(gè)產(chǎn)品類則有多個(gè)具體的建造者
*/
public abstract class Builder{
????// 設(shè)置產(chǎn)品零件:設(shè)置產(chǎn)品的不同零件,或者不同的裝配順序,以產(chǎn)生不同的產(chǎn)品
????public abstract void setPart();
????// 組建一個(gè)產(chǎn)品
????public abstract Product buildProduct();
}
/**
* 3.具體建造者
*/
public class ConcreteBuilder extends Builder{
????private Product product =new Product();
? ?? // 設(shè)置產(chǎn)品零件
? ? public void setPart() {
????????// 產(chǎn)品類內(nèi)的邏輯處理? ?
? ? }
????// 組建一個(gè)產(chǎn)品
????public Product buildProduct() {
????????return product;
??? }
}
/**
* 4.指揮者類
* 指揮者類起到封裝的作用,避免高層模塊深入到建造者內(nèi)部的實(shí)現(xiàn)類
*/
public class Director{
????private Builder builder =new ConcreteBuilder();
????public Product getProduct() {
????????builder.setPart();
? ? ? ? return builder.buildProduct();?
?? }
}