java23種設計模式——五、建造者模式

codermy發表於2020-08-28

原始碼在我的githubgitee中獲取

目錄

java23種設計模式—— 一、設計模式介紹
java23種設計模式—— 二、單例模式
java23種設計模式——三、工廠模式
java23種設計模式——四、原型模式
java23種設計模式——五、建造者模式

建造者模式

建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

一句話概括就是建造者模式的目的是為了分離複雜物件的屬性與建立過程

一、介紹

意圖: 將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。

主要解決: 主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。

何時使用: 一些基本部件不會變,而其組合經常變化的時候。

如何解決: 將變與不變分離開。

關鍵程式碼: 建造者:建立和提供例項,導演:管理建造出來的例項的依賴關係。

應用例項: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。

優點: 1、建造者獨立,易擴充套件。 2、便於控制細節風險。

缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。

使用場景: 1、需要生成的物件具有複雜的內部結構,這些產品物件通常包含多個成員屬性。 2、需要生成的物件內部屬性本身相互依賴。

注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。

以上部分根據菜鳥教程修改

二、實現

我們知道一個電腦生產出來是需要很多部件的,例如cpu,顯示卡,硬碟,螢幕,主機板等等。

新建一個Computer類

/**
 * @author codermy
 * @createTime 2020/7/24
 */
@Data
public class Computer {
    private String mainBoard;//主機板
    private String cpu;//cpu
    private String ideoCard;//顯示卡
    private String hardDisk;//硬碟
    private String memorie; //記憶體條
}

在生成一個用於建造電腦工序的類

/**
 * @author codermy
 * @createTime 2020/7/24
 * 一臺電腦需要完成的工序
 */
public interface ComputerBuilder {
    void buildMainBoard();
    void buildCpu();
    void buildIdeoCard();
    void buildHardDisk();
    void buildMemorie();
    // 建造結果
    Computer build();

}

現在一共可以成產兩種電腦,分別是飛行堡壘 和 拯救者。

飛行堡壘製作工序

/**
 * @author codermy
 * @createTime 2020/7/24
 * 飛行堡壘6
 */
public class ComputerA implements ComputerBuilder {
    private Computer computer = new Computer();
    @Override
    public void buildMainBoard() {
        computer.setMainBoard("X550JK");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i5");
    }

    @Override
    public void buildIdeoCard() {
        computer.setIdeoCard("GTX1060");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("256GB+1TB混合硬碟");
    }

    @Override
    public void buildMemorie() {
        computer.setMemorie("DDR4 8GB×1");
    }

    @Override
    public Computer build() {
        return computer;
    }
}

拯救者製作工序

/**
 * @author codermy
 * @createTime 2020/7/24
 * 拯救者
 */
public class ComputerB implements ComputerBuilder {
    private Computer computer = new Computer();
    @Override
    public void buildMainBoard() {
        computer.setMainBoard("15Isk");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i7");
    }

    @Override
    public void buildIdeoCard() {
        computer.setIdeoCard("GTX1050Ti");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("256GB+1TB混合硬碟");
    }

    @Override
    public void buildMemorie() {
        computer.setMemorie("DDR4 16GB×1");
    }

    @Override
    public Computer build() {
        return computer;
    }
}

新建一個指揮者來指揮完成相應的製作流程

public class Conductor {
    private ComputerBuilder computerBuilder;
	
    public void setComputerBuilder(ComputerBuilder computerBuilder){
        this.computerBuilder = computerBuilder;
    }
    // 指揮建造過程
    public Computer make(){
        computerBuilder.buildMainBoard();
        computerBuilder.buildCpu();
        computerBuilder.buildHardDisk();
        computerBuilder.buildIdeoCard();
        computerBuilder.buildMemorie();
        return computerBuilder.build();
    }
}

客戶要求

/**
 * @author codermy
 * @createTime 2020/7/24
 * 客戶
 */
public class Client {
    public static void main(String[] args) {
        // 一個指揮者
        Conductor conductor = new Conductor();
        // 需要ComputerA 飛行堡壘
        ComputerA fxbl = new ComputerA();
        // 指揮建造ComputerA
        conductor.setComputerBuilder(fxbl);
        // 得到飛行堡壘
        Computer computer1= conductor.make();
        System.out.println(computer1);

        // 一個指揮者
        Conductor conductor2 = new Conductor();
        // 需要ComputerA 拯救者
        ComputerB zjz = new ComputerB();
        // 指揮建造ComputerB
        conductor2.setComputerBuilder(zjz);
        // 得到拯救者
        Computer computer2= conductor2.make();
        System.out.println(computer2);
    }
}

輸出

Computer(mainBoard=X550JK, cpu=Intel Core i5, ideoCard=GTX1060, hardDisk=256GB+1TB混合硬碟, memorie=DDR4 8GB×1)
Computer(mainBoard=15Isk, cpu=Intel Core i7, ideoCard=GTX1050Ti, hardDisk=256GB+1TB混合硬碟, memorie=DDR4 16GB×1)

相關文章