Builder模式

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值