建造者模式

  建造者模式也被称为生成器模式,它是创建一个复杂对象的创建型模式,其将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。例如我们要DIY一台台式计算机,我们找到DIY商家。可以要求这台计算机的CPU、主板或者其他部件都是什么牌子、什么配置的,这些部件是我们可以根据自己的需求来变化的。但是这些部件组装成计算机的过程事一样的,我们不需要知道这些部件是怎样组装成计算机的,只需要提供相关部件的牌子和配置就可以了。(甚至对于一些不是必需的配件,我们可以选择要不要组装到计算机中。)对于这种情况就可以采用建造者模式,将组件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到了最低。
  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  在建造者模式中有如下角色:

  • Director:导演类,负责安排已有模块的顺序,然后通知Builder开始建造;
  • Builder:抽象Builder类,规范产品的组建,一般由子类实现;
  • ConcreteBuilder:具体建造者,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象;
  • Product:产品类;

建造者模式的简单实现

  我们用DIY组装计算机的例子来实现建造者模式。

  • 创建产品类
      计算机抽象为Computer类,它有三个部件:CPU、主板、内存,并在里面提供了三个方法分别用来设置CPU、主板和内存;

    public class Computer{
    private String mCpu;
    private String mMainBoard;
    private String mRam;
    public void setCpu(String cpu){
    this.mCpu = cpu;
    }
    public void setMainBoard(String mainBoard){
    this.mMainBoard = mainBoard;
    }
    public void setRam(String ram){
    this.mRam = ram;
    }

}

* 创建Builder类规范产品的组建
  商家组装计算机有一套组装方法的模板,就是一个抽象的Builder类,其里面提供了安装CPU、主板、内存的方法,以及组装成计算机的create()方法。
```java
public abstract class Builder{
    public abstract void buildCpu(String cpu);
    public abstract void buildMainBoard(String mainBoard);
    public abstract void buildRam(String ram);
    public abstract void Computer create();
}

  商家实现了抽象的Builder类,DemoComputerBuilder类用于组装计算机。(引申到安卓中的Dialog弹窗的创建,以及Dialog中链式编程的使用)

public class DemoComputerBuilder extends Builder{
    private Computer mComputer = new Computer();
    @Override
    public void buildCpu(String cpu){
        mComputer.setCpu(cpu);
    }
    @Override
    public void buildMainBoard(String mainBoard){
        mConputer.setMainBoard(mainBoard);
    }
    
    @Override
    public void buildRam(String ram){
        mComputer.setRam(ram);
    }
    
    @Override
    public Computer create(){
        return mComputer;
    }
}
  • 用导演类来统一组装过程
      商家的导演类用来规范组装计算机的流程规范,先安装主板,再安装CPU,最后安装内存并组装成计算机。

    public class Director{
    Builder mBuilder = null;
    public Director(Builder builder){
    this.mBuilder = builder;
    }
    public Computer createComputer(String cpu,String mainBoard,String ram){
    mBuilder.buildMainBoard(mainBoard);
    mBuilder.buildCpu(cpu);
    mBuilder.builRam(ram);
    return mBuilder.create;
    }
    }
  • 客户端调用导演类
      最后商家用导演类组装计算机。我们只需提供自己想要的CPU、主板、内存就可以了,至于商家怎样组装计算机我们无须知道。

    public class CreateComputer{
    public static void main(String[] args){
    Builder builder = new DemoComputerBuilder();
    Director director = new Director(builder);
    director.createComputer("i7-6700","华擎玩家至尊","三星 DDR4");
    }
    }

使用建造者模式的场景和优缺点

  • 使用场景:
    • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
    • 相同的方法,不同的执行顺序,产生不同的时间结果时;
    • 多个部件或零件都可以被装配到一个对象中,但是产生的运行结果又不相同时;
    • 产品类非常复杂,或者产品类中的调用顺序不同而产生了不同的效果;
    • 在创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化;
  • 优点:
    • 使用建造者模式可以使客户端不必知道产品内部组成的细节;
    • 具体的建造者类之间是相互独立的,容易扩展;
    • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响;
  • 缺点:
    • 产生多余的Build对象以及导演类;

-
-
-
-
-
-
-
-
-
-
-
-
-
-----------------------last line for now------------------------