我们以苹果电脑为例,来了解学习下builder模式
1.这里Computer是一个基础类,以主板,显示器,系统来作为电脑三个属性参数
/**
* 这个是一个基础类
* 定义基础属性参数
* */
public abstract class Computer {
protected String mBroard;
protected String mDisplay;
protected String mOS;
protected Computer(){
}
public void setmBroard(String mBroard) {
this.mBroard = mBroard;
}
public String getmBroard() {
return mBroard;
}
public void setmDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
public String getmDisplay() {
return mDisplay;
}
public void setmOS() {
}
public String getmOS() {
return mOS;
}
@Override
public String toString() {
return "电脑:主板=" + getmBroard() + ",显示器=" + getmDisplay() + ",系统=" + getmOS();
}
}
2.Macbook继承Computer,Macbook系统本身就是苹果系统,所以我们新建Macbook对象的时候自动设置系统属性
public class Macbook extends Computer {
protected Macbook(){
setmOS();
}
@Override
public void setmOS() {
mOS = "Mac OS";
}
}
3.这是一个builder的基础类,包含设置电脑的三个属性参数
/**
* 这是一个基础构建类
*
* */
public abstract class Builder {
public abstract Builder buildBoard(String board);
public abstract Builder buildDisplay(String display);
public abstract Builder buildOS();
public abstract Computer create();
}
4.这里是关键,我们创建一个Macbook的构建者,在这里我们看到,Macbuilder里创建了一个Computer对象指向Macbook,
也就是说,我们构建的对象是这个computer对象,为了代码的封闭性,我们把对象在builder里构建好再传出去,这样比较安全。
注意:这里还有一个知识点,在每一个方法后,我们都返回this,这个this当然指的Macbuilder对象,而这里builder里就包含的我们所需要的computer对象,这样做的好处就是我们可以形成链式调用,具体看步骤5.
public class MacBuilder extends Builder {
protected Computer computer = new Macbook();
@Override
public MacBuilder buildBoard(String board) {
computer.setmBroard(board);
return this;
}
@Override
public MacBuilder buildDisplay(String display) {
computer.setmDisplay(display);
return this;
}
@Override
public MacBuilder buildOS() {
computer.setmOS();
return this;
}
@Override
public Computer create() {
return computer;
}
}
5.可以看出,我们这里builder链式调用了buildDisplay和buildBoard两个方法,是不是感觉跟AlertDialog.Builder有点像!
Builder builder = new MacBuilder();
builder.buildDisplay("戴尔显示器").buildBoard("因特尔主板");
System.out.println(builder.create().toString());
总结,builder的构建模式,主要为了对象构建的封闭性,适合用于对构建比较复杂的对象,分离构建和表达。
以上是builder模式的部分代码