建造者模式+鏈?zhǔn)骄幊?/font>

建造者模式詳解
在軟件開發(fā)過程中有時(shí)需要?jiǎng)?chuàng)建一個(gè)復(fù)雜的對(duì)象,這個(gè)復(fù)雜對(duì)象通常由多個(gè)子部件按一定的步驟組合而成。例如,計(jì)算機(jī)是由 CPU、主板、內(nèi)存、硬盤、顯卡、機(jī)箱、顯示器、鍵盤、鼠標(biāo)等部件組裝而成的,采購員不可能自己去組裝計(jì)算機(jī),而是將計(jì)算機(jī)的配置要求告訴計(jì)算機(jī)銷售公司,計(jì)算機(jī)銷售公司安排技術(shù)人員去組裝計(jì)算機(jī),然后再交給要買計(jì)算機(jī)的采購員。

生活中這樣的例子很多,如游戲中的不同角色,其性別、個(gè)性、能力、臉型、體型、服裝、發(fā)型等特性都有所差異;還有汽車中的方向盤、發(fā)動(dòng)機(jī)、車架、輪胎等部件也多種多樣;每封電子郵件的發(fā)件人、收件人、主題、內(nèi)容、附件等內(nèi)容也各不相同。

以上所有這些產(chǎn)品都是由多個(gè)部件構(gòu)成的,各個(gè)部件可以靈活選擇,但其創(chuàng)建步驟都大同小異。這類產(chǎn)品的創(chuàng)建無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產(chǎn)品的創(chuàng)建。

模式的定義與特點(diǎn)
建造者(Builder)模式的定義:指將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計(jì)模式被稱為建造者模式。它是將一個(gè)復(fù)雜的對(duì)象分解為多個(gè)簡單的對(duì)象,然后一步一步構(gòu)建而成。它將變與不變相分離,即產(chǎn)品的組成部分是不變的,但每一部分是可以靈活選擇的。

該模式的主要優(yōu)點(diǎn)如下:

封裝性好,構(gòu)建和表示分離。

擴(kuò)展性好,各個(gè)具體的建造者相互獨(dú)立,有利于系統(tǒng)的解耦。

客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),建造者可以對(duì)創(chuàng)建過程逐步細(xì)化,而不對(duì)其它模塊產(chǎn)生任何影響,便于控制細(xì)節(jié)風(fēng)險(xiǎn)。


其缺點(diǎn)如下:

產(chǎn)品的組成部分必須相同,這限制了其使用范圍。

如果產(chǎn)品的內(nèi)部變化復(fù)雜,如果產(chǎn)品內(nèi)部發(fā)生變化,則建造者也要同步修改,后期維護(hù)成本較大。


建造者(Builder)模式和工廠模式的關(guān)注點(diǎn)不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創(chuàng)建過程,但兩者可以結(jié)合使用。

模式的結(jié)構(gòu)與實(shí)現(xiàn)
建造者(Builder)模式由產(chǎn)品、抽象建造者、具體建造者、指揮者等 4 個(gè)要素構(gòu)成,現(xiàn)在我們來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。

1. 模式的結(jié)構(gòu)
建造者(Builder)模式的主要角色如下。

產(chǎn)品角色(Product):它是包含多個(gè)組成部件的復(fù)雜對(duì)象,由具體建造者來創(chuàng)建其各個(gè)零部件。

抽象建造者(Builder):它是一個(gè)包含創(chuàng)建產(chǎn)品各個(gè)子部件的抽象方法的接口,通常還包含一個(gè)返回復(fù)雜產(chǎn)品的方法 getResult()。

具體建造者(Concrete Builder):實(shí)現(xiàn) Builder 接口,完成復(fù)雜產(chǎn)品的各個(gè)部件的具體創(chuàng)建方法。

指揮者(Director):它調(diào)用建造者對(duì)象中的部件構(gòu)造與裝配方法完成復(fù)雜對(duì)象的創(chuàng)建,在指揮者中不涉及具體產(chǎn)品的信息。

示例:建房子

產(chǎn)品角色-House ,
抽象建造者 - HouseBuilder,
具體建造者 - ConcreteBuilder,
指揮者- Director
House
import lombok.Data;

/**
 * 描述: 房子 </br>
 * 時(shí)間: 2020-01-14 11:23  </br>
 * 作者:it學(xué)習(xí)道場(chǎng)
 */
@Data
public class House {
    /**地基*/
    private String foundation;
    /**墻體*/
    private String wall;
    /**房頂*/
    private String roof;

    public static HouseBuilder builder(){
        HouseBuilder houseBuilder = new ConcreteBuilder();
        return houseBuilder;
    }


}
HouseBuilder(抽象建造者 )






/**
 * 描述: 抽象建造者:包含創(chuàng)建房子各個(gè)部位的抽象方法。</br>
 * 時(shí)間: 2020-01-14 11:26  </br>
 * 作者:it學(xué)習(xí)道場(chǎng)
 */
public abstract class HouseBuilder {


    /**
     * 建造地基
     */
    public abstract HouseBuilder foundation();

    /**
     * 建造墻體
     */
    public abstract HouseBuilder wall();

    /**
     * 建造屋頂
     */
    public abstract HouseBuilder roof();
    //返回產(chǎn)品對(duì)象
    public abstract House build() ;

}
ConcreteBuilder - 具體建造者
/**
 * 描述: 具體房屋建造者 </br>
 * 時(shí)間: 2020-01-14 11:32  </br>
 * 作者:it學(xué)習(xí)道場(chǎng)
 */
public class ConcreteBuilder extends HouseBuilder {
    protected House house = new House();
    @Override
    public ConcreteBuilder foundation() {
        house.setFoundation("建造地基");
        return this;
        //house.setFoundation("建造地基");
    }

    @Override
    public ConcreteBuilder wall() {
        house.setWall("建造墻體");
        return this;
    }

    @Override
    public ConcreteBuilder roof() {
        house.setRoof("建造屋頂");
        return this;
    }

    @Override
    public House build() {
        return house;
    }
}
Director - 指揮者

/**
 * 描述: 指揮者:鏈?zhǔn)骄幊滔碌逆準(zhǔn)浇ㄔ臁?lt;/br>
 * 時(shí)間: 2020-01-14 11:35  </br>
 * 作者:it學(xué)習(xí)道場(chǎng)
 */
public class Director {

    public static void main(String[] args) {
        House house = House.builder()
                .foundation()
                .wall()
                .roof()
                .build();
        System.out.println(house.toString());
    }
}
指揮者-Director就是建造者模式入口,這里的main方法就是你們程序里的用建造者干活的入口








作者:IT學(xué)習(xí)道場(chǎng)

歡迎關(guān)注微信公眾號(hào) : IT學(xué)習(xí)道場(chǎng)