设计模式–建造者模式

建造者模式定义:

将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

建造者模式包括的角色:

  1. Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。
  2. ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例
  3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建
  4. Product:要创建的复杂对象,产品类

建造者模式的使用场景:

  1. 当产品由复杂的内部构造时(参数很多)
  2. 需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)

举例:组装一台电脑

  1. 产品类:假设一个computer类有三个部件:cpu,主板以及内存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Computer{
    private String mCpu;
    private String mMainboard;
    private String mRam;
    public void setmCpu(String mCpu){
    this.mCpu = mCpu;
    }
    public void setmMainboard(String mMainboard){
    this.mMainboard = mMainboard;
    }
    public void setmRam(String mRam){
    this.mRam = mRam;
    }
    }
  2. Builder类:提供安装cpu,主板,内存的抽象方法,以及组装电脑的create方法

    1
    2
    3
    4
    5
    6
    public abstract class Builder{
    public abstract void buildCpu(String cpu);
    public abstract void buildMainboard(String mianboard);
    public abstract void buildRam(String ram);
    public abstract Computer create();
    }
  3. Builder实现类:里面不仅新建了Computer的实例,还提供了安装CPU,主板和内存的具体实现方法,并且在组装电脑的create方法中将该Computer对象实例返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class MyComputerBuilder extends Builder{
    private Computer mComputer = new Computer();
    @Override
    public void buildCpu(String cpu){
    mComputer.setmCpu(cpu);
    }
    @Override
    public void buildMainboard(String mainboard){
    mComputer.setmMianboard(mainboard);
    }
    @Override
    public void buildRam(String ram){
    mComputer.setmRam(ram);
    }
    @Override
    public Computer create(){
    return mComputer;
    }
    }
  4. Director类:用来规范组装电脑的流程顺序,先安装主板,再安装CPU,最后安装内存并组装成电脑。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Director{
    Builder mBuild = null;
    public Director(Builder build){
    this.mBuild = build;
    }
    public Computer CreateComputer(String cpu,String mainboard,String ram){
    //规范建造流程
    this.mBuild.buildMainboard(mainboard);
    this.mBuild.buildCpu(cpu);
    this.mBuild.buildRam(ram);
    return mBuild.create();
    }
    }
  5. 使用

    1
    2
    3
    Builder mBuilder = new MyComputerBuilder();
    Director mDirector = new Director(mBuilder);
    mDirector.CreateComputer("i7","Intel主板","8G");//返回Computer实例对象