設(shè)計(jì)模式之建造者模式

定義:
將一個(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)者。

大致流程圖:

GIF1.gif

定義出消費(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等很多都是采用變化后的建造者模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 建造者模式(Builder Pattern)也叫做生成器模式,今天讓我們一起學(xué)習(xí)一下建造者模式。 一、基本介紹 建...
    冰鑒IT閱讀 815評(píng)論 2 8
  • 1、初識(shí)建造者模式 建造者模式屬于創(chuàng)建型模式。比如說(shuō):樓房是千差萬(wàn)別的,樓房的外形,層數(shù),內(nèi)部房間的數(shù)量,房間的裝...
    萬(wàn)戶猴閱讀 570評(píng)論 0 2
  • 建造者模式 定義 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 首先這是一個(gè)復(fù)雜的對(duì)...
    晨鳴code閱讀 934評(píng)論 0 1
  • “30歲,我要開(kāi)間咖啡館?!?“30歲,我要?jiǎng)?chuàng)立自己的軟件公司。” 這是很多初出茅廬的年輕人對(duì)于30歲的普遍憧憬。...
    i創(chuàng)青年閱讀 762評(píng)論 0 50
  • 4月的北京姹紫嫣紅,美景喜不勝收,順義郁金香,要多美有多美,瞬間忘記所有都市煩惱,每一次的放松都意味著下一次的挑戰(zhàn)...
    14d90b19e4a0閱讀 197評(píng)論 0 0

友情鏈接更多精彩內(nèi)容