1. 程式人生 > >Java設計模式4:建造者模式

Java設計模式4:建造者模式

一、什麼是建造者模式?

1、定義:

是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

工廠類模式提供的是建立單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來建立複合物件,所謂複合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。

2.模式講解:

1、Builder:給出一個抽象介面,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的哪些部分的建立,並不涉及具體的物件部件的建立。 2、ConcreteBuilder:實現Builder介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。 在建造過程完成後,提供產品的例項。 3、Director(指揮者):呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立。 4、Product:要建立的複雜物件。

二、具體例項:

這裡以建造電腦為例子,為了簡便,我們這裡建造一臺電腦只主要cpu、主機板(MainBoad)、硬碟(HD)。

Computer:

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/9/29 14:43
 *    @desc   : 給出一個抽象介面,以規範產品物件的各個組成成分的建造
 *    @version: 1.0
 * </pre>
 */
public interface ComputerBuilder {

    void buildCPU();
    void buildMainBorad();
    void buildHD();
    //獲得一個組裝好的電腦
    Computer getComputer();

}

要建立的複雜物件。

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/9/29 14:39
 *    @desc   : 定義一個具體的產品類 computer
 *    @version: 1.0
 * </pre>
 */
@Data
public class Computer {

    //cpu
    private String CPU;
    //主機板
    private String MainBorad;
    //硬碟
    private String HD;
}

ComputerBuilder:建造電腦的抽象介面

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/9/29 14:43
 *    @desc   : 給出一個抽象介面,以規範產品物件的各個組成成分的建造
 *    @version: 1.0
 * </pre>
 */
public interface ComputerBuilder {

    void buildCPU();
    void buildMainBorad();
    void buildHD();
    //獲得一個組裝好的電腦
    Computer getComputer();

}

ConcreteBuilder:建造電腦介面的具體實現類

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/9/29 14:47
 *    @desc   : 具體的建造者 實現ComputerBuilder介面
 *    @version: 1.0
 * </pre>
 */
public class ConcreteBuilder implements ComputerBuilder {

    private static Computer computer = new Computer();

    @Override
    public void buildCPU() {
        computer.setCPU("cpu...");
    }

    @Override
    public void buildMainBorad() {
        computer.setMainBorad("MainBorad...");
    }

    @Override
    public void buildHD() {
        computer.setHD("HD..");
    }

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

Director:呼叫具體建造者來建立複雜物件的各個部分

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/9/29 14:53
 *    @desc   : 組裝電腦
 *    @version: 1.0
 * </pre>
 */
public class Director {

    public Computer construct(ComputerBuilder computerBuilder){

        computerBuilder.buildCPU();
        computerBuilder.buildMainBorad();
        computerBuilder.buildHD();
        return computerBuilder.getComputer();
    }

}

測試:

public class Test {
    public static void main(String[] args) {
        Director director = new Director();
        Computer computer = director.construct(new ConcreteBuilder());
        System.out.println(computer.getCPU());
    }
}

總結:

優點:

易於解耦 將產品本身與產品建立過程進行解耦,可以使用相同的建立過程來得到不同的產品。也就說細節依賴抽象。

易於精確控制物件的建立 將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰

易於拓展 增加新的具體建造者無需修改原有類庫的程式碼,易於拓展,符合“開閉原則“。

缺點:

建造者模式所建立的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。

如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。