您的位置:首页 > 产品设计 > UI/UE

设计模式之Builder模式

2016-08-16 10:21 369 查看
还记得我们在写第一次创建一个Dialog时,可以这样做。

AlertDialog.Builer 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("click");
}
})
.create()
.show();


这就是builder模式,也许我们可以在构造区函数中写上十几个参数来完成初始化工作,但是,参数太多,会不会太乱了,而builder模式就是一个不错的选择。

下面是一个牵强的例子:

public class Person {
private String name;
private String id;
private String flag;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getFlag() {
return flag;
}

public void setFlag() {
this.flag = name+id;//在这儿需要初始化一个标志字段,而这个字段是由name和id组合而成
}
}


自己写的代码自己当然可以看懂,但是给别人看时,别人就可能不清楚了,他可能会先调用setFlag(),这样会报空指针异常,这个代码简单,一看就知道了,但是,若代码比较复杂呢?看看下面的一个方法。

public class PersonBuilder {
private String name;
private String id;
public PersonBuilder setName(String name) {
this.name = name;
return this;
}

public PersonBuilder setId(String id) {
this.id = id;
return this;
}
public Person build(){
Person build = new Person();
build.setId(id);
build.setName(name);
build.setFlag();
return build;
}

}


这样通过一个builder来创建我们想要的对象,在这儿处理好先后顺序就可以了。

注意到,Builer类的set函数都会返回自身的引用this,这主要是用于链式调用,这也是Builder设计模式中的一个很明显的特征。

public static void main(String arg[]){
Person person = new PersonBuilder().setName("张三").setId("dsfhoiasfjsdajf").build();
System.out.println(person.getFlag());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: