介绍
Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
UML类图
- Director
统一组装过程。负责安排已有模块的顺序,然后通知Builder开始建造。
- Builder
抽象Builder类,规范产品的组建,一般由子类实现具体的组建过程。
- ConcreteBulider
具体建造者,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象。
- Product
产品类
使用场景
- 相同的方法、不同的执行顺序,产生不同的事件结果时。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用,这个时候使用建造者模式非常合适
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式。
建造者的简单实现
用组装计算机例子来实现一下建造者模式
- 创建产品类
计算机被抽象类为 Computer类,它有3个部件:CPU、主板、内存
// 产品类
public class Computer{
private String mCpu;
private String mMainboard;
private String mRam;
public void setmCpu(String mCpu) {
this.mCpu = mCpu;
System.out.println("安装CPU:"+mCpu);
}
public void setmMainboard(String mMainboard) {
this.mMainboard = mMainboard;
System.out.println("安装主板:"+mMainboard);
}
public void setmRam(String mRam) {
this.mRam = mRam;
System.out.println("安装内存:"+mRam);
}
}
- 创建Builder 类规范产品的组建
组装计算机有一套组装方法的模板,就是一个抽象的Builder 类,其里面提供了安装CPU、主板和内存的方法,以及组装成计算机的create 方法。
// 抽象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 create();
}
// 具体Builder类
public static class MoonComputerBulider 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;
}
}
- 导演类来统一组装过程
导演类 用来规范组装计算机的流程规范,先安装主板,再安装CPU,最后安装内存并组装成计算机。
// 导演类
public class Direcror{
Builder mBuilder=null;
public Direcror(Builder mBuilder) {
this.mBuilder = mBuilder;
}
public Computer createComputer(String cpu,String mainboard,String ram) {
this.mBuilder.buildMainboard(mainboard);
this.mBuilder.buildCpu(cpu);
this.mBuilder.buildRam(ram);
return mBuilder.create();
}
}
- 客户端调用导演类
只需要提供自己想要的CPU、主板和内存就可以,至于怎样组装计算机无需知道。
public static void main(String[] args) {
Builder mBuilder= new MoonComputerBulider();
Direcror mDirecror=new Direcror(mBuilder);
mDirecror.createComputer("intel i7 6500U", "华硕", "DDR3L");
}
执行结果:
安装主板:华硕
安装CPU:intel i7 6500U
安装内存:DDR3L
总结
Builder模式 通常作为配置类的构建器将配置的构建和表示分离开来,同时将配置从目标类中隔离开来,避免过多的setter方法。
优缺点
优点
- 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 具体的建造者类之间是相互独立的、容易拓展。
- 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点
会产生多余的Builder对象以及Director对象,消耗内存