Builder模式

当我们在创建对象的时候,如果对象需要很多的参数,并且有些参数是可选的,有些是必选的,有的可能默认值,这个时候如果我们用构造器传参或者通过set方法进行属性值设置,那么这样就有很大的问题,比如别人在创建这个对象的时候,并不知道需要传哪些参数,哪些参数是必须传值的,而且调用也不方便,所有我们就可以用到Builder模式,这里就是所谓的链式调用。在Effective Java书中, 第2条就是遇到到多个构造器时要考虑用构造器,里面讲的比较详细。

比如我们想这样创建一个对象

new User.Builder("Walker", "Han")
        .age(20)
        .phone("123456789")
        .address("166号")
        .build();

此时我们需要在User类中创建一个内部类Builder,该类用来创建User对象,通过上面的代码我们发现,可以连续调用属性的方法进行传参,这就要求每次调用后都要返回当前对象,这样才能连续调用,下面是代码:

/**
 * 链式调用
 * @author mingshan
 *
 */
public class User {
    private final String firstName; // 必传参数 
    private final String lastName; // 必传参数
    private int age; // 可选参数
    private String phone; // 可选参数 
    private String address; // 可选参数

    private User(Builder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    @Override
    public String toString() {
        return "User [firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", phone=" + phone
                + ", address=" + address + "]";
    }

    public static class Builder {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;

        public Builder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

然后就可以像上面的方式进行调用了。

results matching ""

    No results matching ""