Java设计模式之建造者模式

·  阅读 1385

前言

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

定义

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

使用场景

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 相同的方法,不同的执行顺序,生产不同的事件结果时。
  • 多个部件或零件都可以被装配到一个对象中,但是生产的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同而生产了不同的效能时。
  • 需要创建一些复杂对象,这些对象内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临复杂的变化时。

角色

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

建筑者模式的简单实现

  1. 创建产品类:我们要组装一台计算机,计算机被抽象为 Computer 类,它有3个部件:CPU、主板和内存,并在里面提供3个方法分别用来设置 CPU、主板和内存。
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;
    }
}
复制代码
  1. 创建Builder类规范产品的创建:商家组装计算机有一套组装方法的模版,就是一个抽象的 Builder 类,其里面提供了安装 CPU、主板和内存的方法,以及组装成计算机的 creact 方法。
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 create();
}
复制代码
  1. 创建组装计算机类:商家实现了抽象的 Builder 类,MoonComputerBuilder 类用于组装计算机。
public class MoonComputerBuilder extends Builder {
    private Computer mComputer = new Computer();
    @Override
    public void buildCpu(String cpu) {
        mComputer.setmCpu(cpu);
    }

    @Override
    public void buildMainboard(String mainboard) {
        mComputer.setmMainboard(mainboard);
    }

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

    @Override
    public Computer create() {
        return mComputer;
    }
}
复制代码
  1. 创建导演类:统一管理组装过程。商家就是导演类用来规范组装计算机的流程规范,先安装主板,在安装 CPU ,最后安装内存并组装完成计算机:
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();
    }
}
复制代码
  1. 客户端调用导演类:最后商家用导演类组装计算机。我们只需要提供自己想要的 CPU 、主板和内存就可以了,至于商家怎样组装计算机我们无须知道。
public class CreateComputer {
    public static void main(String[] args){
        Builder mBuilder = new MoonComputerBuilder();
        Director mDirector = new Director(mBuilder);
        //组装计算机
        mDirector.CreateComputer("i7-6700", "华擎玩家至尊", "三星 DDR4");
    }
}
复制代码

优缺点

优点

  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 具体的建造者类之间是相互独立的,容易扩展。
  • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

缺点

  • 多出 Build 对象以及导演类。