設計模式之-建造者模式

1. 簡介

1.1模式說明

隱藏創(chuàng)建對象的建造過程 & 細節(jié),使得用戶在不知對象的建造過程 & 細節(jié)的情況下,就可直接創(chuàng)建復雜的對象

  • 用戶只需要給出指定復雜對象的類型和內(nèi)容;
  • 建造者模式負責按順序創(chuàng)建復雜對象(把內(nèi)部的建造過程和細節(jié)隱藏起來)

1.2 作用(解決的問題)

  • 降低創(chuàng)建復雜對象的復雜度
  • 隔離了創(chuàng)建對象的構(gòu)建過程 & 表示

方便用戶創(chuàng)建復雜的對象(不需要知道實現(xiàn)過程)
代碼復用性 & 封裝性(將對象構(gòu)建過程和細節(jié)進行封裝 & 復用)

例子:造汽車 & 買汽車

工廠(建造者模式):負責制造汽車(組裝過程和細節(jié)在工廠內(nèi))

汽車購買者(用戶):你只需要說出你需要的型號(對象的類型和內(nèi)容),然后直接購買就可以使用了
(不需要知道汽車是怎么組裝的(車輪、車門、發(fā)動機、方向盤等等))

2. 模式原理

2.1 UML類圖

2.2 模式講解

  • 指揮者(Director)直接和客戶(Client)進行需求溝通;
  • 溝通后指揮者將客戶創(chuàng)建產(chǎn)品的需求劃分為各個部件的建造請求(Builder);
  • 將各個部件的建造請求委派到具體的建造者(ConcreteBuilder);
  • 各個具體建造者負責進行產(chǎn)品部件的構(gòu)建;
  • 最終構(gòu)建成具體產(chǎn)品(Product)。

3. 實例講解

3.1 實例概況

背景
小成希望去電腦城買一臺組裝的臺式主機

過程

  • 電腦城老板(Diretor)和小成(Client)進行需求溝通(買來打游戲?學習?看片?)
  • 了解需求后,電腦城老板將小成需要的主機劃分為各個部件(Builder)的建造請求(CPU、主板blabla)
  • 指揮裝機人員(ConcreteBuilder)去構(gòu)建組件;
  • 將組件組裝起來成小成需要的電腦(Product)

3.2 使用步驟

步驟1:定義組裝的過程(Builder):組裝電腦的過程

public abstract class Builder {
    //第一步:裝CPU
    public abstract void buildCPU();

    //裝主板
    public abstract void buildMainboard();

    //裝硬盤
    public abstract void buildHD();

    //返回產(chǎn)品的方法 獲取組裝好的電腦
    public abstract Computer getComputer();
}

步驟2: 電腦城老板委派任務給裝機人員(Director)

public class Director {
    /**
     * //指揮裝機人員組裝電腦
     * @param builder
     */
    public void constract(Builder builder) {
        builder.buildCPU();
        builder.buildMainboard();
        builder.buildHD();
    }
}

步驟3: 創(chuàng)建具體的建造者(ConcreteBuilder):裝機人員

/**
 * //裝機人員1
 */
public class ConcreteBuilder extends Builder {
    //創(chuàng)建產(chǎn)品實例
    Computer mComputer = new Computer();
    @Override
    public void buildCPU() {
        mComputer.add("組裝CPU");
    }

    @Override
    public void buildMainboard() {
        mComputer.add("組裝主板");
    }

    @Override
    public void buildHD() {
        mComputer.add("組裝硬盤");
    }

    /**
     * 返回組裝成功后的電腦
     * @return
     */
    @Override
    public Computer getComputer() {
        return mComputer;
    }
}

步驟4: 定義具體產(chǎn)品類(Product):電腦

public class Computer {
    //電腦組件的集合
    private List<String> parts = new ArrayList<>();

    //用于將組件組裝到電腦里
    public void add(String part) {
        parts.add(part);
    }

    public void show() {
        for (int i = 0; i < parts.size(); i++) {
            Log.e("===z","組件" + parts.get(i) + "組裝好了");
        }
        Log.e("===z","電腦組裝完成,請驗收");
    }
}

步驟5:客戶端調(diào)用-小成到電腦城找老板買電腦

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Builder builder = new ConcreteBuilder();
        Director director = new Director();
        director.constract(builder);

        Computer computer = builder.getComputer();
        computer.show();
    }

輸出結(jié)果:


4.優(yōu)缺點

優(yōu)點

易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建過程進行解耦,可以使用相同的創(chuàng)建過程來得到不同的產(chǎn)品。也就說細節(jié)依賴抽象。

易于精確控制對象的創(chuàng)建
將復雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰

易于拓展
增加新的具體建造者無需修改原有類庫的代碼,易于拓展,符合“開閉原則“

缺點

建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。

如果產(chǎn)品的內(nèi)部變化復雜,可能會導致需要定義很多具體建造者類來實現(xiàn)這種變化,導致系統(tǒng)變得很龐大

5.應用場景

  • 需要生成的產(chǎn)品對象有復雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對象具備共性;
  • 隔離復雜對象的創(chuàng)建和使用,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品。

OK 常用的設計模式到此結(jié)束 下期 我們講責任鏈模式

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

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

  • 建造者模式(Builder Pattern)也叫做生成器模式,今天讓我們一起學習一下建造者模式。 一、基本介紹 建...
    冰鑒IT閱讀 806評論 2 8
  • 1、嘻哈說 首先,請您欣賞建造者模式的原創(chuàng)歌曲。 試聽請點擊這里 閑來無事聽聽曲,知識已填腦中去; 學習復習新方式...
    番茄課堂_懶人閱讀 722評論 0 0
  • 建造者模式 定義 將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 首先這是一個復雜的對...
    晨鳴code閱讀 929評論 0 1
  • 模式定義 建造者模式:將一個復雜產(chǎn)品的創(chuàng)建與表示分離,使得同樣的創(chuàng)建過程可以創(chuàng)建不同的表示客戶端不用去關心產(chǎn)品對象...
    C_zx閱讀 575評論 1 5
  • 序言 在看Retrofit源碼時,可以看到里面用到了大量的設計模式,如果我們非常了解設計模式對理解是很有幫助的,在...
    游戲人日常閱讀 401評論 0 1

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