建造者模式(Builder Pattern)


前言

設(shè)計模式系列代碼均持續(xù)更新在我的gitHub:to github


I. 定義

  • 建造者模式,又稱生成器模式,是一種對象構(gòu)建模式。它可以將復(fù)雜對象的建造過程抽象出來,既相同的部位和布局,可以構(gòu)建出不同的表現(xiàn)形式。例如: 每個用戶的博客空間布局都是類似的,但每個用戶所發(fā)的文章不同。

優(yōu)點

  • 逐步構(gòu)建復(fù)雜對象,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的細節(jié)。[即封裝性好]

例如我們?nèi)ベ徺I電腦。我們可以靈活選擇不同的cpu、顯卡型號,最后只要指定一個型號,就可以交由商家去組裝電腦。

  • 擴展性好,各個具體的建造者相互獨立,有利于系統(tǒng)的解耦。
  • 客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),建造者可以對創(chuàng)建過程逐步細化,而不對其它模塊產(chǎn)生任何影響,便于控制細節(jié)風(fēng)險。

缺點

  • 產(chǎn)品型號可以不同,但是組成部分的類型必須相同,[你總不能把內(nèi)存條插到放硬盤的地方吧] 這限制了其使用范圍
  • 如果產(chǎn)品的內(nèi)部變化復(fù)雜,如果產(chǎn)品內(nèi)部發(fā)生變化,則建造者也要同步修改,后期維護成本較大。


II. 建造者模式的四大角色

  1. Product - 具體的產(chǎn)品對象
  2. Builder - 抽象創(chuàng)造者,指定各個部件的 接口/抽象類
  3. ConcreteBuilder - 具體建造者,實現(xiàn)接口,構(gòu)建和裝配各個具體部件
  4. Director - 指揮者,構(gòu)建一個使用Builder接口的對象。主要作用是創(chuàng)建一個復(fù)雜對象。同時隔離客戶與對象的生產(chǎn)過程。負責(zé)控制產(chǎn)品對象的生產(chǎn)過程。


III. 建造者模式的類圖

類間關(guān)系描述
  • ComputerBuilder 構(gòu)建者抽象
  • Computer 產(chǎn)品類型
  • Computer_v1 / Computer_v2 具體構(gòu)建者。代表不同類型的電腦
  • Director 指揮者
  • Client 客戶

執(zhí)行邏輯: 客戶給指揮者發(fā)送一個電腦類型,指揮者交由具體構(gòu)建者執(zhí)行,然后由抽象構(gòu)建者的builderComputer()方法返回一個Computer實例。


IV. 來人,上代碼!

  • Computer
/**
 * Product - 產(chǎn)品類型 
 * 省略 get/set/constructor */
public class Computer {
    /* 以下屬性也可以是引用類型, 僅使用普通變量做演示 */
    private String cpu; // cpu 型號
    private String gpu; // 顯卡型號
    private String ram; // 運行內(nèi)存大小
    private String rom; // 存儲內(nèi)存大小
  • ComputerBuilder
public abstract class ComputerBuilder {

    protected Computer computer = new Computer();

    public abstract void setCPU();

    public abstract void setGPU();

    public abstract void setRAM();

    public abstract void setROM();

    public Computer buildComputer() {return this.computer; }
}
  • Computer_v1
public class Computer_v1 extends ComputerBuilder {
    @Override
    public void setCPU() {
        this.computer.setCpu("i5-*");
    }
    @Override
    public void setGPU() {
        this.computer.setGpu("GTX 980");
    }
    @Override
    public void setRAM() {
        this.computer.setRam("8g");
    }
    @Override
    public void setROM() {
        this.computer.setRom("固態(tài)-無,機械-1T");
    }
}
  • Computer_v2
package builder;

public class Computer_v2 extends ComputerBuilder {
    @Override
    public void setCPU() {
        this.computer.setCpu("i9-*");
    }
    @Override
    public void setGPU() {
        this.computer.setGpu("RTX 3090");
    }
    @Override
    public void setRAM() {
        this.computer.setRam("16G");
    }
    @Override
    public void setROM() {
        this.computer.setRom("固態(tài)-256G,機械-1T");
    }
}
  • Director
public class Director {

    private ComputerBuilder computerBuilder;

    public Director(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    /* 如果我要換一個方案,則只需SET,無需再new */
    public void setComputerBuilder(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public Computer constructComputer() {
        /* 構(gòu)建順序如下 */
        this.computerBuilder.setCPU();
        this.computerBuilder.setGPU();
        this.computerBuilder.setRAM();
        this.computerBuilder.setROM();

        return this.computerBuilder.buildComputer();
    }
}
  • Client
public class Client {
    public static void main(String[] args) {
        /* 構(gòu)建一臺低配電腦 */
        Computer_v1 computer_v1 = new Computer_v1();
        Director director = new Director(computer_v1);
        Computer myComputer = director.constructComputer();
        System.out.println("myComputer => " + myComputer);

        /* 使用set換一個構(gòu)建方式 */
        Computer_v2 computer_v2 = new Computer_v2();
        director.setComputerBuilder(computer_v2);
        Computer myDream = director.constructComputer();
        System.out.println("my Dream Computer => " + myDream);
    }
}
  • 控制臺結(jié)果


    運行結(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ā)布平臺,僅提供信息存儲服務(wù)。

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

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