如何写Android 的Builder设计模式

Builder(构建者)模式的定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的展示。
为什么要用构建者模式?

1.简单的new 对象实例的方法,是难写、难读、难维护,对象属性多了就要重叠构造器如

new User(name);  
new User(name,age);  
new User(name,age,sex);  
......  
code中常有一个类有多个构造函数,构造函数的参数个数一般递增,层层调用,我们叫他重叠构造器模式
2.简单的javaBean,虽然易维护,但是很难保持一致
优点:JavaBean可以避免传参数不知道对应哪个字段、修改参数类型容易对应错的问题。  
      JavaBean的setter方法中明确了对应的字段和类型,省去了重叠构造方法。  
缺点:  
      JavaBean对象可以随时调用setter方法进行设置,这会让Bean缺乏一致性、也就是类的实例的一致性没法保证了。在多线程情况下,会出现很难分析的bug

3.Builder模式解决了JavaBean一致性的问题,  

 在Bean中创建静态内部Builder类,使用Builder中类似setter的方法设置对应的属性给Builder。然后通过public Bean build(){}方法,实例化Bean对象并返回给客户调用者,重要的是这个Bean对象是确定下来的, 而且Builder模式的灵活性,可以通过不同的setter生成多个自定义的Bean对象。


写Builder模式的步骤有四步:
a.定义一个静态内部类Builder,内部的成员变量和外部类一样
b.Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
c.Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
d.外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值


例子:

public class UserBuilderTest {  
    private String name;//四个属性与UserBuilder内部类的属性一致  
    private String age;  
    private String sex;  
    private String birday;  
  
    private UserBuilderTest(UserBuilder builder) {//私有化的构造,只能通过UserBuilder.builder方法去new  
        this.name = builder.name;//把内部类中的属性赋值给外部类的成员变量  
        this.age = builder.age;  
        this.sex = builder.sex;  
        this.birday = builder.birthday;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public String getAge() {  
        return age;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public String getBirday() {  
        return birday;  
    }  
  
    public static class UserBuilder {//静态内部类  
        private String name;//四个属性与外部类的属性一致
        private String age;  
        private String sex;  
        private String birthday;  
  
        public UserBuilder name(String name) {  
            this.name = name;  
            return this;  
        }  
  
        public UserBuilder age(String age) {  
            this.age = age;  
            return this;  
        }  
  
        public UserBuilder sex(String sex) {  
            this.sex = sex;  
            return this;  
        }  
  
        public UserBuilder birthday(String birthday) {  
            this.birthday = birthday;  
            return this;  
        }  
  
        public UserBuilderTest build() {//new 实例  
            return new UserBuilderTest(this);  
        }  
    }  
}

参考:https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr.simple

http://www.jianshu.com/p/e2a2fe3555b9

http://www.jianshu.com/p/a281944e7d18

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值