軟體設計模式系列之五——建造者模式

2023-09-15 06:01:06

1 模式的定義

建造者模式是一種物件建立型設計模式,它將一個複雜物件的構建過程與其表示分離。這意味著你可以使用相同的構建過程來建立不同型別的物件,而不必關心每個物件的內部細節。這種模式適用於構建具有複雜設定的物件,例如具有多個可選元件的汽車。

2 結構

建造者模式的結構包括以下幾個關鍵部分:

Director(指導者):負責指導構建過程的順序,它並不直接建立產品,而是通過建造者來構建產品。
Builder(建造者):定義了建立產品各個部分的介面,具體的建造者實現這些介面以構建具體產品。
ConcreteBuilder(具體建造者):實現了Builder介面,負責具體產品的構建過程。
Product(產品):表示最終構建出的複雜物件,它通常包含了多個部分。

3 舉例說明

建造者模式可以通過組裝電腦的過程來解釋。在電腦組裝中,你有多個可選元件(如CPU、記憶體、硬碟、顯示卡等),每個元件有不同的設定選項。建造者模式將這個過程分解為以下部分:

產品(Product):電腦是最終的產品,具有多個元件(CPU、記憶體等)。

抽象建造者(Builder):定義了建立電腦各個元件的介面,例如安裝CPU、記憶體等。

具體建造者(Concrete Builder):每個具體建造者實現了抽象建造者介面,負責構建不同設定的電腦,例如高效能電腦、辦公電腦等。

指導者(Director):負責指導建造電腦的順序,如安裝CPU、記憶體、硬碟等。

通過建造者模式,你可以使用相同的構建過程建立不同型別的電腦,保持了靈活性和可維護性,同時將構建過程與最終產品分離,使得電腦組裝變得更加可控和可延伸。

4 實現步驟

建造者模式的實現步驟通常包括:

定義產品的抽象類或介面,以及產品的各個部分。
建立具體建造者類,實現Builder介面,負責構建產品的各個部分。
建立Director類,負責指導建造過程的順序,它包含一個Builder成員變數用於構建產品。
在使用者端程式碼中,建立Director物件並指定一個具體的建造者物件,然後通過Director來構建產品。

5 程式碼實現

以下是一個簡單的Java程式碼範例,演示瞭如何使用建造者模式來組裝電腦,包括CPU、硬碟和主機板等元件.

// 產品類:電腦
class Computer {
    private String cpu;
    private String hardDisk;
    private String motherboard;

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

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

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

    @Override
    public String toString() {
        return "Computer [CPU=" + cpu + ", HardDisk=" + hardDisk + ", Motherboard=" + motherboard + "]";
    }
}

// 抽象建造者介面
interface ComputerBuilder {
    void buildCPU();

    void buildHardDisk();

    void buildMotherboard();

    Computer getComputer();
}

// 具體建造者類
class HighEndComputerBuilder implements ComputerBuilder {
    private Computer computer;

    public HighEndComputerBuilder() {
        computer = new Computer();
    }

    @Override
    public void buildCPU() {
        computer.setCPU("High-end CPU");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("1TB SSD");
    }

    @Override
    public void buildMotherboard() {
        computer.setMotherboard("High-end Motherboard");
    }

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

// 指導者類
class Director {
    private ComputerBuilder computerBuilder;

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

    public void constructComputer() {
        computerBuilder.buildCPU();
        computerBuilder.buildHardDisk();
        computerBuilder.buildMotherboard();
    }
}

// 使用者端程式碼
public class Main {
    public static void main(String[] args) {
        ComputerBuilder builder = new HighEndComputerBuilder();
        Director director = new Director(builder);

        director.constructComputer();
        Computer highEndComputer = builder.getComputer();

        System.out.println("High-end Computer Specs:");
        System.out.println(highEndComputer);
    }
}

在這個範例中,我們定義了產品類Computer,抽象建造者介面ComputerBuilder,以及具體建造者類HighEndComputerBuilder。指導者類Director負責控制構建過程的順序。使用者端程式碼建立具體建造者物件並使用指導者來構建電腦。這樣,我們就可以輕鬆地建立不同設定的電腦物件。

6 典型應用場景

建造者模式在建立複雜物件時,它可以提供一種更加靈活和可維護的方式。以下是建造者模式的一些典型應用場景:

建立複雜物件:建造者模式適用於構建複雜的物件,這些物件可能有多個元件或部分,而且這些元件之間存在複雜的依賴關係。例如,建立包含多個可選元件的電子產品、汽車、飛機等。

隱藏構造過程的細節:建造者模式允許將構造物件的複雜性封裝在具體建造者中,使用者端程式碼只需關心如何指導建造過程,而不必關心物件的具體構建細節。這有助於降低使用者端程式碼的複雜性。

建立不同設定的物件:如果需要建立多個具有相似屬性但不同設定的物件,建造者模式非常有用。你可以使用不同的具體建造者來建立不同設定的物件,而不必重複相似的構建程式碼。

提高程式碼可讀性:通過使用建造者模式,可以清晰地看到物件的構建過程,使程式碼更易於理解和維護。每個具體建造者都負責一部分構建過程,使程式碼更加模組化和可讀性更高。

避免物件不完整或不一致:建造者模式可以確保在構建物件的過程中不會產生不完整或不一致的物件。在構建過程中,要麼物件完全構建成功,要麼不構建。

總之,建造者模式在需要建立複雜物件、隱藏構建細節、提高可讀性和靈活性等情況下非常有用。它允許你以分步驟的方式構建物件,並在建立過程中動態設定物件的屬性,使得程式碼更易於管理和維護。

7 優缺點

優點:

將構建過程與產品表示分離,使得構建過程更靈活。
可以通過不同的具體建造者來建立不同型別的物件。
可以重複使用相同的構建過程來構建不同的物件。

缺點:

增加了程式碼的複雜性,因為需要定義抽象建造者和具體建造者類。
如果產品的部分元件較少,可能會顯得過於繁瑣。

8 類似模式

建造者模式與以下幾種設計模式有一定的相似性:

抽象工廠模式(Abstract Factory Pattern):抽象工廠模式也用於建立複雜物件,但它關注的是建立一組相關或相互依賴的物件,而不是單個物件。建造者模式關注的是構建單個複雜物件,其構建過程逐步進行。

工廠模式(Factory Pattern):工廠模式用於建立物件,但不像建造者模式那樣關心物件的構建過程的細節。工廠模式簡單地返回一個已經構建好的物件,而建造者模式允許在構建過程中設定物件的屬性和設定。

原型模式(Prototype Pattern):原型模式通過複製現有物件來建立新物件,而不需要詳細的構建過程。與建造者模式不同,原型模式不涉及構建物件的複雜性,而是複製現有物件的狀態。

9 小結

建造者模式是一種有助於建立複雜物件的設計模式,它通過將構建過程分步驟進行,允許你建立不同型別的物件,並保持構建過程的獨立性。通過定義抽象建造者和具體建造者類,以及使用指導者來管理構建順序,你可以更好地控制物件的構建過程。建造者模式在需要建立多個不同設定的物件或構建過程較為複雜的情況下特別有用。但要注意,它可能會增加程式碼的複雜性,因此應在合適的情況下使用。