今天我们来说说设计模式中的建造者模式。
日常开发中我们见过的建造者模式应该还不算少,平常用的Dialog和一些第三方框架,挺多一部分正是用了建造者模式。
建造者模式是创建一个复杂对象的创建型模式,有人也称它为生成器模式,它将其构建复杂对象的过程和它
的组件解耦,使得构建过程和组件分离开来。比如我们自己DIY一部手机,我们可以根据自己的喜好去选择
它的CPU,是麒麟的还是骁龙的,还有它的屏幕, 是要索尼的还是三星的,或是其他组件的其他要求,这些
组件是我们根据自己的喜好选择的,但是这些组件组装成一部手机的过程是一样的,我们无须知道这些部件是
怎么样组装成手机的,我们只需要提供相应的组件和配置就可以了。对于这种情况下,我们就比较适合用建造
者模式了,将组件和组件的组装过程分离,使得组件和组装过程都可以自由扩展。
还是一样,我们先来看看它的定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式中有如下角色:
Director:导向器,引向器,负责安排已有模块的顺序,然后通知Builder开始建造。
Builder:抽象Builder类,规范产品的组建,一般由子类实现。
ConcreteBuilder:具体建造者,实现抽象Builder类中定义的所有方法,并且返回一个组建好的对象。
Product:产品类。
下面我们用一个例子简单实现下建造者模式。
首先我们创建产品类,新建一个Phone类,假设它有三个零件组成:CPU,屏幕、电池。并提供3个方法
用来设置CPU、屏幕、电池。
public class Phone{
private String mCpu;
private String mScreen;
private String mBattery;
public void setmCpu(String mCpu){
this.mCpu = mCpu;
}
public void setmScreen(String mScreen){
this.mScreen = mScreen;
}
public void setmBattery(String mBattery){
this.mBattery = mBattery;
}
}
接下来我们需要Builder抽象类,用来规范产品的组件,一部完整的手机需要一个CPU、屏幕、电池。
其里面提供了安装CPU、屏幕、电池的方法,以及组装成计算机的create方法。
public abstract class Builder{
public abstract void buildCpu(String cpu);
public abstract void buildScreen(String screen);
public abstract void buildBattery(String battery);
public abstract Phone create();
}
接着我们实现具体的建造者,SuperPhoneBuilder用于组装超级手机。
public class SuperPhoneBuilder extends Builder{
private Phone mPhone = new Phone();
@Override
public void buildCpu(String cpu) {
mPhone.setmCpu(cpu);
}
@Override
public void buildScreen(String screen) {
mPhone.setmScreen(screen);
}
@Override
public void buildBattery(String battery) {
mPhone.setmBattery(battery);
}
@Override
public Phone create() {
return mPhone;
}
}
最后我们需要导向器来规范组装手机的流程规范,先安装CPU,然后装屏幕,最后装电池。
public class Direcror{
Builder mBuild = null;
public Direcror(Builder build){
this.mBuild = build;
}
public Phone createPhone(String cpu,String srceen,String battery){
this.mBuild.buildCpu(cpu);
this.mBuild.buildScreen(srceen);
this.mBuild.buildBattery(battery);
this.mBuild.create();
}
}
到这里,我们的组建手机的过程已经定义完成了,接下来我们看看最后我们怎么去组装这部手机,我们只需要
提供自己想要的CPU型号,屏幕厂商,和电池容量就可以了,至于它是怎么组建的我们无须知道。看看代码
public class CreatePhone{
public static void main(String[] args){
Builder builder = new SuperPhoneBuilder();
Direcror direcror = new Direcror(builder);
Phone phone = direcror.createPhone("麒麟810","Sony 4K","10000mAh");
}
}
现在,我们完整的建造手机的例子已经完成。
接下来整理一下建造者模式的使用场景和优缺点。
使用场景:
1:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2:相同的方法,不同的执行顺序,产生不同的事件结果时。
3:多个部件或零件都可以被装配到一个对象中,但是产生的运行结果又不相同时。
4:产品类非常复杂,或者产品类中的调用顺序不同而产生了不同的效能。
5:在创建一下复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件
面临着复杂的变化。
优点:
1:使用建造者模式可以使客户端段不必知道产品内部组成的细节。
2:具体的建造者之间是相互独立的,容易扩展。
3:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点:
产生多余的Build对象以及导向器。
再累再苦,只当自己是二百五,再艰再险,只当自己是二皮脸。与君共勉~