设计模式之Builder模式

还记得我们在写第一次创建一个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());
    }

你可能感兴趣的:(java基础学习)