建造者模式(Builder)

一、基本定义:

1、意图:
将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、适用场景:
* 多个组成部分,都可以装配到同一个对象,但是产生的结果不相同
* 相同的方法,不同的执行顺序,产生不同的事件结果
例:电脑含有很多零配件,可以算是一个复杂对象。其中内存卡,主板、CPU等都是电脑的组成部分,如果构建一台电脑,不需要知道是如何组装的,只需要提供所需要的零配件型号,此时就可以用构建者模式。
3、优点:
* 可以使使用者不必知道内部组成的细节
* 具体构造是独立的,方便逐步细化
4、类图:
建造者模式(Builder)_第1张图片
* Director:导演类,负责安排模块顺序,通知Builder开始构建
* Builder:抽象Builder类,规范产品的组建
* ConcreteBuilder:构造者实现类,实现抽象类的所有方法,并且返回一个组建好的对象
* Product:产品类

二、实例:

1、产品实体类:

public class Computer {
    private String cpu;
    private String mainBoard;
    private String ram;

    public String getCpu() {
        return cpu;
    }

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

    public String getMainBoard() {
        return mainBoard;
    }

    public void setMainBoard(String mainBoard) {
        this.mainBoard = mainBoard;
    }

    public String getRam() {
        return ram;
    }

    public void setRam(String ram) {
        this.ram = ram;
    }
}

2、抽象Builder:

public abstract class Builder {
    public abstract void buildCpu(String cpu);
    public abstract void buildMainBoard(String mainBoard);
    public abstract void buildRam(String ram);
    public abstract Computer build();
}

3、Builder实现类:

public class ComputerBuilder extends Builder {
    private Computer mComputer = new Computer();

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildMainBoard(String mainBoard) {
        mComputer.setMainBoard(mainBoard);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public Computer build() {
        return mComputer;
    }
}

4、导演类:
起到封装的作用,避免深入到Builder内部的具体实现。可以传入不同的Builder实现对象。

public class ComputerDirector {
    private Builder mBuilder;

    private ComputerDirector(Builder builder) {
        this.mBuilder = builder;
    }

    public Computer createComputer(String cpu, String mainBoard, String ram) {
        mBuilder.buildCpu(cpu);
        mBuilder.buildMainBoard(mainBoard);
        mBuilder.buildRam(ram);
        return mBuilder.build();
    }
}

5、客户端调用:

public class ComputerTest {
    public static void main(String[] args){
        Builder builder = new ComputerBuilder();
        ComputerDirector director = new ComputerDirector(builder);
        director.createComputer("i3","my board", "4g");
    }
}

特点总结:
* 封装性:使用建造者模式,可以使客户端不用知道产品内部实现的细节
* 构造者比较独立,容易扩展

你可能感兴趣的:(设计模式)