package builder;

/**
 *   返回一个带有内部类的引用的外部类,外部类的参数由于有final修饰,
    所以外部类的对象是不可变的,而内部类则保证了参数的灵活构造
    这有点延迟初始化的意思,像工厂方法一样,将类的构造推迟了一下
    通过这一推迟,便推出了灵活性和不可变性
    但这也导致了对象无法进行后续修改,只能重新构造
    但这也是有解决方法的,只要把外部类的字段的final去掉,添加上
    set方法,即既可以拥有Builder模式的便利又可以灵活改变对象,只是会牺牲不可变性

    综上,本模式的核心在于:
    1. 内部类Builder含有外部类的字段,
    2. 每个字段的set方法返回this引用
    3. build()方法返回外部类的实例,并包含自身的引用
    4. 外部类通过内部类的引用构造自己
 */
public class CartmanBean {

    private final String name;
    private final Integer age;
    private final String gender;
    private final String friend;
    private final Integer grade;
    private final String outlook;

    private CartmanBean(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.gender = builder.gender;
        this.friend = builder.friend;
        this.grade = builder.grade;
        this.outlook = builder.outlook;
    }

    public static class Builder {
        // 必须初始化的参数
        private final String name;
        private final Integer age;
        // 选择初始化的参数, 没有了final
        private String gender;
        private String friend;
        private Integer grade;
        private String outlook;

        // 首先构造必须的参数
        public Builder(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // 然后构造可选的参数,关键是返回this
        public Builder gender(String gender) {
            this.gender = gender;
            return this;
        }

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

        public Builder grade(Integer grade) {
            this.grade = grade;
            return this;
        }

        public Builder outlook(String outlook) {
            this.outlook = outlook;
            return this;
        }
        // 返回一个带有内部类的引用的外部类,外部类的参数由于有final修饰,
        // 所以外部类的对象是不可变的,而内部类则保证了参数的灵活构造
        // 这有点延迟初始化的意思,像工厂方法一样,将类的构造推迟了一下
        // 通过这一推迟,便推出了灵活性和不可变性
        // 但这也导致了对象无法进行后续修改,只能重新构造
        public CartmanBean build() {
            return new CartmanBean(this);
        }
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public String getGender() {
        return gender;
    }

    public String getFriend() {
        return friend;
    }

    public Integer getGrade() {
        return grade;
    }

    public String getOutlook() {
        return outlook;
    }

    @Override
    public String toString() {
        return this.name+" "+this.age+" "+this.outlook+" "+this.friend;
    }
}

package builder;

public class Client {

    public static void main(String[] args) {
        CartmanBean cartman = new CartmanBean.Builder("cartman",12)
                .friend("kyle").gender("boy").outlook("handsome").build();
        System.out.println(cartman.toString());

    }
}
结果:
cartman 12 handsome kyle
posted on 2019-01-23 16:21  被杜撰的风  阅读(120)  评论(0编辑  收藏  举报