天天看点

设计模式之——建造者模式一、基本介绍二、包含角色三、案例及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个角色每个觉得职责划分很合理,没有违背单一职责原则。

      缺:划分得太细需要创建的类过于多,使用过程变复杂。

方式二优缺点:

      优:少创建类,使用过程变简单。

      缺:违背单一职责原则

注意:一般使用方式二比较多,即使违背单一职责,但没有把代码复杂化,当然也可以使用方式一。

继续阅读