搜索
您的当前位置:首页正文

怎样使用Builder模式

2020-11-27 来源:步旅网

这次给大家带来怎样使用Builder模式,使用Builder模式的注意事项有哪些,下面就是实战案例,一起来看一下。

概述

Builder模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景

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

  • 多个部件或零件,都可以装配到一个对象中,但产生的运行结果又不相同时

  • 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用

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

  • 下面从一个Person例子进行分析重叠构造器模式、JavaBeans模式、Builder模式的使用。Person类有两个必要参数(id和name),有5个可选参数(age,sex,phone,address和desc)

    重叠构造器模式

    在这种模式下,你提供第一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个有两个可选参数,依此类推,最后一个构造器包含所有的可选参数。下面看看其编程实现:

    / * 使用重叠构造器模式
     */
    public class Person {
     //必要参数
     private final int id;
     private final String name;
     //可选参数
     private final int age;
     private final String sex;
     private final String phone;
     private final String address;
     private final String desc;
     public Person(int id, String name) {
     this(id, name, 0);
     }
     public Person(int id, String name, int age) {
     this(id, name, age, "");
     }
     public Person(int id, String name, int age, String sex) {
     this(id, name, age, sex, "");
     }
     public Person(int id, String name, int age, String sex, String phone) {
     this(id, name, age, sex, phone, "");
     }
     public Person(int id, String name, int age, String sex, String phone, String address) {
     this(id, name, age, sex, phone, address, "");
     }
     public Person(int id, String name, int age, String sex, String phone, String address, String desc) {
     this.id = id;
     this.name = name;
     this.age = age;
     this.sex = sex;
     this.phone = phone;
     this.address = address;
     this.desc = desc;
     }
    }

    从上面的代码中,当你想要创建实例的时候,就利用参数列表最短的构造器,但该列表中包含了要设置的所有参数:

    Person person = new Persion(1, "李四", 20, "男", "18800000000", "China", "测试使用重叠构造器模式");

    重叠构造器可行,但是当有许多参数的时候,创建使用代码会很难写,并且较难以阅读

    JavaBeans模式

    采用Javabean 的写法,写一堆属性的setter方法,通过生成对象,让后调用setter方法给属性赋值。

    / * 使用JavaBeans模式
     */
    public class Person {
     //必要参数
     private int id;
     private String name;
     //可选参数
     private int age;
     private String sex;
     private String phone;
     private String address;
     private String desc;
     public void setId(int id) {
     this.id = id;
     }
     public void setName(String name) {
     this.name = name;
     }
     public void setAge(int age) {
     this.age = age;
     }
     public void setSex(String sex) {
     this.sex = sex;
     }
     public void setPhone(String phone) {
     this.phone = phone;
     }
     public void setAddress(String address) {
     this.address = address;
     }
     public void setDesc(String desc) {
     this.desc = desc;
     }

    这种模式弥补了重叠构造器模式的不足。创建实例很容易,这样产生的代码读起来也很容易:

    Person person = new Person();
    person.setId(1);
    person.setName("李四");
    person.setAge(20);
    person.setSex("男");
    person.setPhone("18800000000");
    person.setAddress("China");
    person.setDesc("测试使用JavaBeans模式");

    JavaBeans模式因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来保证一致性。

    Builder模式

    Builder模式既能保证像重叠构造器那样的安全,也能实现JavaBean模式那样的可读性。

    /**
     * 使用Builder模式
     */
    public class Person {
     //必要参数
     private final int id;
     private final String name;
     //可选参数
     private final int age;
     private final String sex;
     private final String phone;
     private final String address;
     private final String desc;
     private Person(Builder builder) {
     this.id = builder.id;
     this.name = builder.name;
     this.age = builder.age;
     this.sex = builder.sex;
     this.phone = builder.phone;
     this.address = builder.address;
     this.desc = builder.desc;
     }
     public static class Builder {
     //必要参数
     private final int id;
     private final String name;
     //可选参数
     private int age;
     private String sex;
     private String phone;
     private String address;
     private String desc;
     public Builder(int id, String name) {
     this.id = id;
     this.name = name;
     }
     public Builder age(int val) {
     this.age = val;
     return this;
     }
     public Builder sex(String val) {
     this.sex = val;
     return this;
     }
     public Builder phone(String val) {
     this.phone = val;
     return this;
     }
     public Builder address(String val) {
     this.address = val;
     return this;
     }
     public Builder desc(String val) {
     this.desc = val;
     return this;
     }
     public Person build() {
     return new Person(this);
     }
     }
    }

    Person是不可变得,所有的默认参数值都单独放在一个地方。builder的setter方法返回builder本身,以便可以链式调用。下面是客户端使用代码:

    Person person = new Person.Builder(1, "张三")
    .age(18).sex("男").desc("测试使用builder模式").build();

    Android源码中的Builder模式

  • AlertDialog源码

  • Universal-Image-Loader图片库

  • OkHttp的Request源码

  • 相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

    推荐阅读:

    Angular CLI怎样操作路由

    Angularjs做出控制器相互通信功能详解

    Top