概述
建造者模式又称Builder模式,它是一步步创建一个复杂的对象然后进行构建。可以精准的控制对象的构造过程。此模式是将构建复杂对象的过程与它的部件解耦,使得构建过程和部件的表示隔离开来。
一个对象有很多复杂的信息,比如人,有身高,体重,性别,姓名,年龄等等。如何将这些信息给组合起来,然后形成这个对象。比如男生很多,20岁的男生也很多。这个信息组成的过程很漫长。对于这种情况,构建过程中对外部影藏了具体如何实现的,使得组成过程中可以自由扩展,也就降低了两者的耦合度。
使用场景
1、相同的方法,不同的执行顺序,产生的结果不一样。
2、多个信息可以组装到一个对象中,但是产品的运行结果又不相同。
3、当初始化一个对象特别复杂的时候,且一些对象是有默认值的情况。
4、需要生成的对象内部属性本身相互依赖。
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
具体实现
android内部使用的builder模式
这边上一个最常使用的例子,dialog:
private void showDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon).setTitle( "Title" ).setMessage( "Message" ).setPositiveButton( "Button1" ,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle( "点击了对话框上的Button1" );
}
}).setNeutralButton( "Button2" ,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle( "点击了对话框上的Button2" );
}
}).setNegativeButton( "Button3" ,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle( "点击了对话框上的Button3" );
}
});
builder.create().show(); // 构建AlertDialog, 并且显示
}
上述代码中,builder可以设置dialog的icon,title,message,button等信息。在调用create方法时,我们会将这些信息参数保存在dialog的AlertController中。这边源码的具体实现我们就不分析了。最后调用show方法将这个dialog显示出来。
自己撸一个builder模式
public class Test {
public Set set() {
return new Set();
}
public void overload(Set set) {
set.textView.setText(set.age+":"+set.name+":"+set.value+".");
}
public class Set {
private int age="18";
private String name="我就是马云飞";
private String value="男";
private TextView textView;
public Set setAge(int age) {
this.age = age;
return this;
}
public Set setName(String name) {
this.name = name;
return this;
}
public Set setValue(String value) {
this.value = value;
return this;
}
public Set setTextView(TextView textView) {
this.textView = textView;
return this;
}
public void over() {
overload(this);
}
}
}
在Test这个类通过返回一个Set对象。Set方法中,每个返回本类实例的对象。最后通过over方法来调用Test的overload方法完成设置。
调用方法:
test=new Test();
test.set().setAge(18).setName("张三").setValue("男").setTextView(text).over();
输出结果:
18:张三:男
如果我们什么属性都没设置,那么输出结果如下:
18:我就是马云飞:男
总结
Builder模式在开发过程中也是比较常用的,比如目前比较流程的rxjava。比较常用的形式就是通过链式调用,让代码看起来通俗易懂。
优点:
- 良好的封装性,容易扩展。
- 可以控制内部的细节风险。
缺点:
- 必须要有共同点,使用受限。
- 内部复杂时,容易产生多余的builder对象。