Builder模式

来源:互联网 发布:dsp算法大全c语言 pdf 编辑:程序博客网 时间:2024/05/16 11:20

Builder模式定义

  • 将一个复制对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(抽象拗口)

Builder模式的使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果

  2. 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值

  3. 多个布局或零件,都可以装配到一个对象中,但是产生的运行结构又不相同

简化的Builder模式
用一个内部类实现类的创建,链式调用,根据你的需要创建出来对象。

public class User {    private String name;    private String id;    private User() {}    private User(String name) {        this.name = name;    }    private User(String name, String id) {        this.name = name;        this.id = id;    }    private String getName() {        return name;    }    private void setName(String name) {        this.name = name;    }    private String getId() {        return id;    }    private void setId(String id) {        this.id = id;    }    @Override    public String toString() {        // TODO Auto-generated method stub        return String.format("[name: %s, id: %s]",name,id);    }    //内部类    public static class Builder {        private User user = new User();        public Builder() {        }        public Builder setName(String name) {            user.setName(name);            return this;        }        public Builder setId(String id) {            user.setId(id);            return this;        }        public User build() {            return user;        }    }}//测试public static void main(String[] args) {        User.Builder builder = new User.Builder();        User user = null;        user = builder.setName("lise")        .setId("11").build();//链式调用        System.out.println(user.toString());}

经典Builder模式
UML类图
来源自《Android源码设计模式与解析实战》

Product:产品抽象类
Builder:抽象Builder类,规范产品组建,一般是由子类实现
ConcreteBuilder:具体的Builder类
Director:统一组装过程
Product

public abstract class User {    protected String name;    protected String id;    protected int age;    protected String address;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public abstract void setId();    public void setAge(int age) {        this.age = age;    }    public void setAddress(String address) {        this.address = address;    }    @SuppressLint("DefaultLocale")    @Override    public String toString() {        return String.format(" User [name : %s, id : %s, age : %d, address : %s]", name,id,age,address);    }}

具体的Product类

public class SysUser extends User {    public SysUser(){}    public void setId() {        id = "10086";    }}

抽象的Builder类

public abstract class Builder {    public abstract void buildName(String name);    public abstract void buildId();    public abstract void buildAge(int age);    public abstract void buildAddress(String address);    public abstract User create();}

具体的Builder类

public class AccountBuilder extends Builder {    private User user = new SysUser();    @Override    public void buildName(String name) {        user.setName(name);    }    @Override    public void buildId() {        user.setId();    }    @Override    public void buildAge(int age) {        user.setAge(age);    }    @Override    public void buildAddress(String address) {        user.setAddress(address);    }    @Override    public User create() {        return user;    }}

Director角色,负责构造User

public class Director {    Builder mBuilder = null;    public Director(Builder builder){        this.mBuilder = builder;    }    public void construct(String name,int age,String address){        mBuilder.buildName(name);        mBuilder.buildId();        mBuilder.buildAge(age);        mBuilder.buildAddress(address);    }}

测试代码

    public static void main(String[] args) {        Builder builder = new AccountBuilder();        Director director = new Director(builder);        director.construct("tom", 23, "shenzhen");        System.out.println("Info :" + builder.create().toString());    }

结果输出

Info : User [ name : tom, id : 10086, age : 23, address : shenzhen]

优点:是创建与表示相互隔离,解耦
缺点:创建的类多,复杂的类关系。

Android中使用Builder模式
开发中用到的AlertDialog,示例如下:

private void showDialog(){        AlertDialog.Builder builder=new AlertDialog.Builder(context);        builder.setIcon(R.drawable.icon);        builder.setTitle("Title");        builder.setMessage("Message");        builder.setPositiveButton("Button1", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                //TODO            }        });        builder.setNegativeButton("Button2", new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                //TODO            }        });        builder.create().show();}
原创粉丝点击