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

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

建造者模式 屬于 創(chuàng)建型模式,提供一種創(chuàng)建對象的最佳方式。

創(chuàng)建型模式 指不是直接使用new的方法,提供另外一種創(chuàng)建對象的方式,并向調(diào)用者隱藏 創(chuàng)建對象的細節(jié),該模式使創(chuàng)建對象更加的靈活。

建造者模式

簡介

將簡單對象一步步的構(gòu)建為復雜的對象。換句話說,就是將復雜的對象的構(gòu)建與表示進行分離。

有順序的創(chuàng)建復雜對象。

模式原理

該模式有四個角色。

  • Product:最終生成的對象 產(chǎn)品者
  • Builder:構(gòu)建者的抽象基類,定義創(chuàng)建產(chǎn)品的抽象步驟。一般為抽象類(有時會用接口代替)。在其中會有一個返回產(chǎn)品的方法。抽象建造者
  • ConcreteBuilder:繼承Builder類,實現(xiàn)抽象方法,該類實現(xiàn)產(chǎn)品的生成。 實際建造者
  • Director:該類 指導實際建造者 如何生成產(chǎn)品。 指揮者

UML類圖

該圖片引用于菜鳥教程。
img

生活實例

可能看這些術(shù)語懵懵的,我們來點與生活相關(guān)的實例。

既然 創(chuàng)建型模式 是創(chuàng)建對象,那我們也來創(chuàng)建一個對象。

比如說,我們現(xiàn)在要創(chuàng)建一個 自行車。

img

一個自行車 由很多部件組成

假設(shè) 是一個框架,一個座位,還有輪胎組成。

自行車 可能會有不同的廠家生產(chǎn),需要定一個標準,讓各大廠家遵守這個規(guī)則生產(chǎn)。

不同廠家,生產(chǎn)這些部件的方式 可能不同,但都需要實現(xiàn)上面的標準。

光生產(chǎn)這些部件不行,還要把他們組裝起來才能夠用,并且還需要按照一定的順序才行。

這個例子 我們來一一對應四個角色。

自行車-->產(chǎn)品者

標準-->抽象建造者

不同的廠家--> 實際建造者。

部件組裝-->指揮者。

代碼實現(xiàn)

下面我們用代碼來實現(xiàn)上面的思路。

自行車類 產(chǎn)品者

package create.builder.bike;
public class Bike {

    private String frame;
    private String seat;
    private String tire;

    public String getFrame() {
        return frame;
    }
    public void setFrame(String frame) {
        this.frame = frame;
    }
    public String getSeat() {
        return seat;
    }
    public void setSeat(String seat) {
        this.seat = seat;
    }
    public String getTire() {
        return tire;
    }
    public void setTire(String tire) {
        this.tire = tire;
    }

    @Override
    public String toString() {
        return "Bike{" +
                "frame='" + frame + '\'' +
                ", seat='" + seat + '\'' +
                ", tire='" + tire + '\'' +
                '}';
    }
}

行業(yè)標準 抽象建造者

//抽象建造者 定義了構(gòu)建產(chǎn)品的步驟
public abstract class Builder {
    abstract void buildFrame();
    abstract void buildSeat();
    abstract void buildTire();
    abstract Bike createBike();//返回一個對象的方法
}

不同廠家 實際建造者

摩拜單車(摩拜打錢)

package create.builder.bike;
//摩拜單車
//實際真正的建造者
public class MobikeBuilder extends Builder {

    private Bike mBike = new Bike();
    @Override
    void buildFrame() {
        mBike.setFrame("mobike");
    }

    @Override
    void buildSeat() {
        mBike.setSeat("mobikeSeat");
    }

    @Override
    void buildTire() {
        mBike.setTire("mobikeTire");
    }

    @Override
    Bike createBike() {
        return mBike;
    }

    @Override
    public String toString() {
        return "MobikeBuilder{" +
                "mBike=" + mBike +
                '}';
    }
}

ofo單車(ofo打錢)

package create.builder.bike;

public class OfoBuilder extends Builder {
    private Bike oBike = new Bike();
    @Override
    void buildFrame() {
        oBike.setFrame("OfoBike");
    }
    @Override
    void buildSeat() {
        oBike.setSeat("OfoBikeSeat");
    }

    @Override
    void buildTire() {
        oBike.setTire("OfoBike");
    }

    @Override
    Bike createBike() {
        return oBike;
    }

    @Override
    public String toString() {
        return "OfoBuilder{" +
                "oBike=" + oBike +
                '}';
    }
}

部件組裝 指揮者

public class Director {
    //傳遞過來真正的建造者。
    private Builder mBuilder ;
    public Director(Builder builder) {//注入真正的建造者
        mBuilder = builder;
    }
    public Bike construct() {
        //告訴具體建造者如何建造產(chǎn)品 最終決定 構(gòu)建的順序。
        //控制建造的先后順序 以及返回產(chǎn)品。
        mBuilder.buildFrame();
        mBuilder.buildSeat();
        mBuilder.buildTire();
        return mBuilder.createBike();
    }
}

模擬客戶 來要車

public class Client {
    public static void main(String[] args) {
        //客戶 找 指揮者 要車,要什么車 就new 哪個工廠的車。
        //然后 生產(chǎn)一個車給客戶。
        //客戶完全不要關(guān)心 自行車是怎么創(chuàng)建出來的,只管找指揮者要就行了。
        //再次實現(xiàn)了 創(chuàng)建型模式 向調(diào)用者隱藏創(chuàng)建細節(jié)的要求。
        Director director = new Director(new MobikeBuilder());
        Bike bike = director.construct();
        System.out.println(bike.toString());

        Director director2 = new Director(new OfoBuilder());
        Bike bike2 = director2.construct();
        System.out.println(bike2.toString());
    }
}

實驗結(jié)果

image-20210329225921288

整理思路

我們再來理一遍思路。

  • 客戶 找 指揮者要車
  • 指揮者 找 真正的建造者要車部件
  • 真正的建造車 生產(chǎn)出車部件給指揮者
  • 指揮者 將車部件 按照順序組裝,然后給客戶。

重新思考

我們再來思考之前的那個簡介

建造者模式 是將簡單對象構(gòu)建為復雜對象。

自行車的各個部件是一個簡單對象。

自行車 是一個復雜對象。

在 這個實例中 我為了簡化代碼 是將Frame Seat Tire簡化為String 類型。

實際上 他們也是一個類型。按照實際的話應該這樣寫

privat Frame frame;
privat Seat seat;
privat Tire tire;

我們組裝自行車(復雜對象),就像是搭積木一樣,一個一個部件(簡單對象)的往上面加,之后再構(gòu)成我們想要的自行車(復雜對象)。


建議看完后 自己上手 實際敲一遍,這樣印象更加深刻。

與抽象工廠模式的聯(lián)系

  • 抽象工廠也是生產(chǎn)產(chǎn)品的。它是工廠的工廠,生產(chǎn)的是一系列的獨立的產(chǎn)品。而建造者模式 生產(chǎn)的是不同產(chǎn)品的組裝,是一個組裝好的完整產(chǎn)品。

  • 我們可以將 不同廠家生產(chǎn) 自行車的部件(MobikeBuilder),使用抽象工廠模式。配件生產(chǎn)工廠

而將自行車的組裝 使用建造者模式。配件組裝工廠

如果不懂抽象工廠,可以去看看我的這篇文章。

簡單易懂的工廠模式

作業(yè)實踐

使用建造者模式 生產(chǎn)一臺筆記本電腦。

聲明

本篇文章借鑒于 一篇文章就徹底弄懂建造者模式

特向原作者表示感謝!

如果有任何疑問,請在評論區(qū)留言,我將知無不言言無不盡。

最后,碼字不易。如果本篇文章對你有些許的幫助,還請幫我點個贊,評論一下。

你的贊同是我創(chuàng)作的最大動力。

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

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

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