設計模式-建造者模式(Builder Pattern)

上一篇 <<<外觀/門面模式(Facade Pattern)
下一篇 >>>適配器模式(Adapter Pattern)


建造者模式:將一個復雜的對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

特點
a、需要生成的對象具有復雜的內(nèi)部結(jié)構(gòu)。
b、需要生成的對象內(nèi)部屬性本身相互依賴。

優(yōu)點
1.使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié)。
2.具體的建造者類之間是相互獨立的,對系統(tǒng)的擴展非常有利。
3.由于具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產(chǎn)生任何影響。

  • Builder:給出一個抽象接口,以規(guī)范產(chǎn)品對象的各個組成成分的建造。這個接口規(guī)定要實現(xiàn)復雜對象的哪些部分的創(chuàng)建,并不涉及具體的對象部件的創(chuàng)建。
  • ConcreteBuilder:實現(xiàn)Builder接口,針對不同的商業(yè)邏輯,具體化復雜對象的各部分的創(chuàng)建。 在建造過程完成后,提供產(chǎn)品的實例。
  • Director:調(diào)用具體建造者來創(chuàng)建復雜對象的各個部分,在指導者中不涉及具體產(chǎn)品的信息,只負責保證對象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
  • Product:要創(chuàng)建的復雜對象。

應用場景

  • a、StringBuilder
  • b、mybatis的xml解析組裝
  • c、OkHttpClient
    Request request = new Request.Builder().url("http://www.jarye.cn").build();

與工廠模式的區(qū)別

a、工廠類模式提供的是創(chuàng)建單個類的模式,而建造者模式則是將各種產(chǎn)品集中起來進行管理,用來創(chuàng)建復合對象【指某個類具有不同的屬性】,
b、建造者模式更加關(guān)注與零件裝配的順序,其實就是前面抽象工廠模式和最后的Test結(jié)合起來得到的。

建造者模式的核心代碼

//產(chǎn)品角色 Computer
public class Computer {
    private String brand;
    private String cpu;
    private String mainBoard;
    private String hardDisk;
    private String displayCard;
    private String power;
    private String memory;
    // 省略 getter, setter, toString
}
//抽象建造者 builder
public abstract class Builder {
    protected Computer computer = new Computer();

    public abstract void buildBrand();
    public abstract void buildCPU();
    public abstract void buildMainBoard();
    public abstract void buildHardDisk();
    public abstract void buildDisplayCard();
    public abstract void buildPower();
    public abstract void buildMemory();
    public Computer createComputer() {
        return computer;
    }
}
//具體建造者 DellComputerBuilder,ASUSComputerBuilder,分別建造戴爾電腦和華碩電腦
public class DellComputerBuilder extends Builder {
    @Override
    public void buildBrand() {
        computer.setBrand("戴爾電腦");
    }
    @Override
    public void buildCPU() {
        computer.setCpu("i5-8300H 四核");
    }
    @Override
    public void buildMainBoard() {
        computer.setMainBoard("戴爾主板");
    }
    @Override
    public void buildHardDisk() {
        computer.setHardDisk("1T + 128GB SSD");
    }
    @Override
    public void buildDisplayCard() {
        computer.setDisplayCard("GTX1060 獨立6GB");
    }
    @Override
    public void buildPower() {
        computer.setPower("4芯 鋰離子電池 180W AC適配器");
    }
    @Override
    public void buildMemory() {
        computer.setMemory("4G + 4G");
    }
}
//指揮者 ComputerDirector,指揮構(gòu)建過程
public class ComputerDirector {
    public Computer construct(Builder builder) {
        // 逐步構(gòu)建復雜產(chǎn)品對象
        Computer computer;
        builder.buildBrand();
        builder.buildCPU();
        builder.buildDisplayCard();
        builder.buildHardDisk();
        builder.buildMainBoard();
        builder.buildMemory();
        builder.buildPower();
        computer = builder.createComputer();
        return computer;
    }
}
//客戶端測試
public class Test {
    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();

        Builder asusBuilder = new ASUSComputerBuilder();
        Computer asusComputer = director.construct(asusBuilder);
        System.out.println(asusComputer.toString());

        Builder dellBuilder = new DellComputerBuilder();
        Computer dellComputer = director.construct(dellBuilder);
        System.out.println(dellComputer.toString());
    }
}

相關(guān)文章鏈接:
<<<23種常用設計模式總覽
<<<代理模式(Proxy Pattern)
<<<裝飾模式(Decorator Pattern)
<<<觀察者模式(Observer Pattern)
<<<單例模式(Singleton Pattern)
<<<責任鏈模式(Chain of Responsibility Pattern)
<<<策略模式(Strategy Pattern)
<<<模板方法模式(Template Pattern)
<<<外觀/門面模式(Facade Pattern)
<<<適配器模式(Adapter Pattern)
<<<原型模式(Prototype Pattern)
<<<工廠相關(guān)模式(Factory Pattern)

最后編輯于
?著作權(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)容