概念:建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离
使用建造者模式的场景和优缺点:
使用场景
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
相同的方法,不同的执行顺序,产生不同的事件结果时。
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
当构造一个对象需要很多参数或者参数的个数和类型不固定的情况下
开源框架(okhttp,Glide等)
优缺点
优点:
1、更好的复用性,生成器模式很好的实现构造算法和具体产品实现的分离
2、具体的建造者类之间是相互独立的,容易扩展。
3、可以很容易的改变产品的内部表示
缺点:
1、产生多余的Build对象以及Dirextor类,消耗内存
2、对象的构造过程暴露
例如:我们要DIY一台计算机,对于CPU、主板或者其他部件什么牌子的,什么配置的,我们根据自己的需求来进行变化,但是这些部件组装成一台电脑的过程都是一样的,我们无需知道这些部件是怎么组装成电脑的,我们只需要提供相关部件的牌子和配置就可以了。对于这种情况我们可以采用建造者模式,将部件和组装过程分离,使得构造过程和部件都可以自由扩展,将两者之间的耦合降低到最低。
在建造者模式中有如下角色:
Dirextor: 指挥者类,用于统一组装流程
Builder: 抽象Builder类,规范产品的组建,一般是由子类实现。
ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回 一个组建好的对象
Product: 产品类
代码实例:
1)创建产品类
我要组装一台电脑,电脑被抽象为Computer类,它有三个部件:CPU 、主板和内存。并在里面提供了三个方法分别用来设置CPU 、主板和内存:
/**
* Created by Administrator on 2018/5/10.
*/
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类规范产品的组建
商家组装电脑有一套组装方法的模版,就是一个抽象的Builder类,里面提供了安装CPU、主板和内存的方法,以及组装成电脑的create方法:
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类,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;
}
}
3)用Dirextor指挥者类来统一组装过程
商家的指挥者类用来规范组装电脑的流程规范,先安装主板,再安装CPU,最后安装内存并组装成电脑:
public class Direcror {
Builder mBuild=null;
public Direcror(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();
}
}
4)客户端调用指挥者类
最后商家用指挥者类组装电脑。我们只需要提供我们想要的CPU,主板和内存就可以了,至于商家怎样组装的电脑我们无需知道。
public class CreatComputer {
public static void main(String[]args){
Builder mBuilder=new MoonComputerBuilder();
Direcror mDirecror=new Direcror(mBuilder);
//组装电脑
mDirecror.CreateComputer("i7-6700","华擎玩家至尊","三星DDR4");
}
}