創建型模式:建造者

建造者(Builder)模式也被稱爲生成器模式,創建型模式是主要是爲了解決對象的創建的方式,相較於單態則是爲了保證創建的對象的唯一性問題,建造者模式是爲了解決複雜對象的創建,尤其是子對象的構建過程存在順序和邏輯關係的時候。

模式場景與說明

比如對象由多個複雜的子對象組成的情況,多個對象組成的方式一般較爲穩定,但是子對象的創建過程可能會發生變化,根據OCP原則,可以考慮對子對象的創建過程進行封裝。

實現方式

一個通用創建型模式的使用可能會有如下部分組成:

組成部分 類型 作用
Product 創建的內容
Builder 接口 包含返回Product的build或者composite方法
ConcreteBuilder 具體建造類 實現了Builder接口的具體建造類,此類在加載時會創建一個Product對象
Director 調配類 一般此類的構建函數包含Builder類型的參數,通過此類提供統一的調配,包括順序和邏輯,簡單場景下可以不需要此類的存在

示例概要

在這裏插入圖片描述

代碼示例

// Product
class Computer {
    private String cpu;
    private String memory;
    private String graphics;
    private String motherboard;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void setGraphics(String graphics) {
        this.graphics = graphics;
    }

    public void setMotherboard(String motherboard) {
        this.motherboard = motherboard;
    }

    @Override
    public String toString(){
        return "Computer information: \n"
                + "CPU: " + this.cpu + "\n"
                + "Memory: " + this.memory + "\n"
                + "Graphics: " + this.graphics + "\n"
                + "Motherboard: " + this.motherboard;
    }
}

interface Builder {
    void buildMotherboard(String motherboard);
    void buildGraphics(String graphics);
    void buildCpu(String cpu);
    void buildMemory(String memory);
    Computer build();
}

class ConcreteBuilder implements Builder {
    private Computer computer = new Computer();

    @Override
    public void buildMotherboard(String motherboard){
        this.computer.setMotherboard(motherboard);
    }
    @Override
    public void buildGraphics(String graphics){
        this.computer.setGraphics(graphics);
    }
    @Override
    public void buildCpu(String cpu) {
        this.computer.setCpu(cpu);
    }
    @Override
    public void buildMemory(String memory){
        this.computer.setMemory(memory);
    }
    @Override
    public Computer build(){
        return this.computer;
    }
}

class Director {
    private Builder builder = null;
    Director(Builder builder) { this.builder = builder; }
    Computer buildComputer(String motherboard, String graphics, String cpu,String memory) {
        this.builder.buildMotherboard(motherboard);
        this.builder.buildGraphics(graphics);
        this.builder.buildCpu(cpu);
        this.builder.buildMemory(memory);

        return this.builder.build();
    }
}

public class BuilderTest {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);

        Computer computer =  director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3");
        System.out.print(computer);
    }
}

執行結果爲:

Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 1536 MB
Motherboard: 820-00xxx

但是需要注意此模式解決的問題和Factory不同,因此它是在具體建造類的加載期間就生成了Product的實例,可結合如下示例代碼進行進一步的思考

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

        Computer computer =  director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3");
        System.out.println(computer);

        Computer computer2 =  director.buildComputer("830-00xxx", "Intel Iris Pro 3032 MB","2.5 GHz Quad-Core Intel Core i7","32 GB 1600 MHz DDR3");
        System.out.println(computer2);
        System.out.println(computer);

執行結果如下所示

Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 1536 MB
Motherboard: 820-00xxx
Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 32 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 3032 MB
Motherboard: 830-00xxx
Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 32 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 3032 MB
Motherboard: 830-00xxx

其他設計模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章