天天看點

設計模式之——建造者模式一、基本介紹二、包含角色三、案例及UML類圖案例說明:四、适用場景五、兩種方式對比

一、基本介紹

建造者模式(建立型):指将一個複雜對象的構造與它的表示分離,使同樣的建構過程可以建立不同的表示,它是将一個複雜的對象分解為多個簡單的對象,然後一步一步建構而成。它将變與不變相分離,即産品的組成部分是不變的,但每一部分是可以靈活選擇的。

二、包含角色

1.指揮者:它調用建造者對象中的部件構造與裝配方法完成複雜對象的建立,即建構搭建步驟。

2.産品角色:包含多個組成部件的複雜對象,由具體建造者來建立其各個部件,即最終建構出來的複雜對象。

3.抽象建造者:它是一個包含建立産品各個子部件的抽象方法的接口,也包含某些通用部件的建構方法。

4.具體建造者:實作抽象建造者接口,完成複雜産品的各個部件的具體建立方法。

三、案例及UML類圖

案例說明:

         目前需要建立一台電腦,按照步驟從裡到外建構每一個元件,最後把它生産出來即可,當然每個廠商的電腦都是大同小異,建造步驟是相同,但具體細節不一定相同。

方式一:有指揮者

               UML類圖:

設計模式之——建造者模式一、基本介紹二、包含角色三、案例及UML類圖案例說明:四、适用場景五、兩種方式對比

類AbstractComputerBulider:

public abstract class AbstractComputerBulider {

    protected Computer computer = new Computer();



    public abstract void createCpu();

    public abstract void createBrand();

    public abstract void createSize();

    public abstract void createSystem();

    /**
     * 因為電壓都相同,是以直接在父類設定
     */
    public void createPower() {
        computer.setPower(220);
    }

    public abstract void createShell();

    public Computer buliderComputer() {
        //隻傳回對象,具體建構過程由指揮者把控,職責劃分。
        return computer;
    }

}
           

說明:抽象電腦建造者,抽象建造者,定義了建構産品的步驟以及通用方法。

類Computer:

public class Computer {

    //品牌
    private String brand;

    //尺寸大小
    private String size;

    //電源
    private Integer power;

    //cpu
    private String cpu;

    //外殼
    private String shell;

    //系統
    private String system;


    public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }

    public String getShell() {
        return shell;
    }

    public void setShell(String shell) {
        this.shell = shell;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }


    public Integer getPower() {
        return power;
    }

    public void setPower(Integer power) {
        this.power = power;
    }

    public String getCpu() {
        return cpu;
    }

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

}
           

說明:電腦類,産品角色,最終建立出來的産品。

類Director:

public class Director {

    private AbstractComputerBulider bulider;

    public Director(AbstractComputerBulider bulider) {
        this.bulider = bulider;
    }

    public Computer bulider() {
        bulider.createBrand();
        bulider.createPower();
        bulider.createSize();
        bulider.createCpu();
        bulider.createSystem();
        //最後才建構外殼
        bulider.createShell();
        return bulider.buliderComputer();
    }
}
           

說明:指揮者,用于建構建造産品的步驟。

類DaiErComputerBuilider:

public class DaiErComputerBuilider extends AbstractComputerBulider {
    @Override
    public void createCpu() {
        computer.setCpu("i5");
    }

    @Override
    public void createBrand() {
        computer.setBrand("戴爾");
    }

    @Override
    public void createSize() {
        computer.setSize("15.6");
    }

    @Override
    public void createSystem() {
        computer.setSystem("win10");
    }

    @Override
    public void createShell() {
        computer.setShell("金屬拉絲");
    }
}
           

說明:戴爾電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。

類HuaWeiComputerBulider:

public class HuaWeiComputerBulider extends AbstractComputerBulider {


    @Override
    public void createCpu() {
        computer.setCpu("i5");
    }

    @Override
    public void createBrand() {
        computer.setBrand("華為");
    }

    @Override
    public void createSize() {
        computer.setSize("14");
    }

    @Override
    public void createSystem() {
        computer.setSystem("Deepin linux");
    }

    @Override
    public void createShell() {
        computer.setShell("塑膠外殼");
    }
}
           

說明:華為電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。

類BuliderTest1:

public class BuliderTest1 {

    public static void main(String[] args) {
        //建構華為電腦
        Director huaWeiDirector = new Director(new HuaWeiComputerBulider());
        Computer huaWeiComputer = huaWeiDirector.bulider();
        System.out.println(huaWeiComputer.getBrand());
        //建構戴爾電腦
        Director daiErDirector = new Director(new DaiErComputerBuilider());
        Computer daiErComputer = daiErDirector.bulider();
        System.out.println(daiErComputer.getBrand());
    }
}
           

說明:測試及用戶端。

方式二:無指揮者

       UML類圖:

設計模式之——建造者模式一、基本介紹二、包含角色三、案例及UML類圖案例說明:四、适用場景五、兩種方式對比

類AbstractComputerBulider:

public abstract class AbstractComputerBulider {

    protected Computer computer = new Computer();



    public abstract void createCpu();

    public abstract void createBrand();

    public abstract void createSize();

    public abstract void createSystem();

    /**
     * 因為電壓都相同,是以直接在父類設定
     */
    public void createPower() {
        computer.setPower(220);
    }

    public abstract void createShell();

    public Computer buliderComputer() {
        //建構步驟,充當指揮者的角色,違背了單一職責原則
        createBrand();
        createPower();
        createSize();
        createCpu();
        createSystem();
        //最後才建構外殼
        createShell();
        return computer;
    }

}
           

說明:抽象電腦建造者,抽象建造者,定義了建構産品的步驟以及通用方法,并且兼職了指揮者角色,在建造時定義了建構步驟。

類Computer:

public class Computer {

    //品牌
    private String brand;

    //尺寸大小
    private String size;

    //電源
    private Integer power;

    //cpu
    private String cpu;

    //外殼
    private String shell;

    //系統
    private String system;


    public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }

    public String getShell() {
        return shell;
    }

    public void setShell(String shell) {
        this.shell = shell;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }


    public Integer getPower() {
        return power;
    }

    public void setPower(Integer power) {
        this.power = power;
    }

    public String getCpu() {
        return cpu;
    }

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

}
           

說明:電腦類,産品角色,最終建立出來的産品。

類DaiErComputerBuilider:

public class DaiErComputerBuilider extends AbstractComputerBulider {
    @Override
    public void createCpu() {
        computer.setCpu("i5");
    }

    @Override
    public void createBrand() {
        computer.setBrand("戴爾");
    }

    @Override
    public void createSize() {
        computer.setSize("15.6");
    }

    @Override
    public void createSystem() {
        computer.setSystem("win10");
    }

    @Override
    public void createShell() {
        computer.setShell("金屬拉絲");
    }
}
           

說明:戴爾電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。

類HuaWeiComputerBulider:

public class HuaWeiComputerBulider extends AbstractComputerBulider {


    @Override
    public void createCpu() {
        computer.setCpu("i5");
    }

    @Override
    public void createBrand() {
        computer.setBrand("華為");
    }

    @Override
    public void createSize() {
        computer.setSize("14");
    }

    @Override
    public void createSystem() {
        computer.setSystem("Deepin linux");
    }

    @Override
    public void createShell() {
        computer.setShell("塑膠外殼");
    }
}
           

說明:華為電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。

類BuliderTest2:

public class BuliderTest2 {


    public static void main(String[] args) {
        //建構華為電腦
        AbstractComputerBulider huaWeiBulider= new HuaWeiComputerBulider();
        Computer huaWeiComputer = huaWeiBulider.buliderComputer();
        System.out.println(huaWeiComputer.getBrand());
        //建構戴爾電腦
        AbstractComputerBulider daiErBulider = new DaiErComputerBuilider();
        Computer daiErComputer = daiErBulider.buliderComputer();
        System.out.println(daiErComputer.getBrand());
    }
}
           

說明:測試及用戶端類。

四、适用場景

1.适用于建立的對象較複雜,由多個部件構成,各部件面臨着複雜的變化,構件間的建造順序是穩定的,最終産品的差異化較小。

五、兩種方式對比

方式一優缺點:

      優:包含4個角色每個覺得職責劃分很合理,沒有違背單一職責原則。

      缺:劃分得太細需要建立的類過于多,使用過程變複雜。

方式二優缺點:

      優:少建立類,使用過程變簡單。

      缺:違背單一職責原則

注意:一般使用方式二比較多,即使違背單一職責,但沒有把代碼複雜化,當然也可以使用方式一。

繼續閱讀