• Builder模式


    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
    
  • 相关阅读:
    [iPad]PencilKit教程3、检查,修改和构造PencilKit绘图
    [iPad]PencilKit教程2、PencilKit的新功能
    [iPad]PencilKit教程1、PencilKit介绍
    为什么要谨慎使用Arrays.asList、ArrayList的subList?
    精通高并发与多线程,却不会用ThreadLocal?
    拥抱Kubernetes,再见了,SpringBoot @Scheduled
    从小公司进入大厂,我都做对了哪些事?
    总结我的Java朋友
    MySQL如何实时同步数据到ES?试试这款阿里开源的神器!
    基于Java访问数据库
  • 原文地址:https://www.cnblogs.com/Lothlorien/p/10309664.html
Copyright © 2020-2023  润新知