美文网首页
Builder构建者模式 通用模板

Builder构建者模式 通用模板

作者: 龙之舞ing | 来源:发表于2017-01-15 11:21 被阅读0次

    能看到这篇文章的读者,我想应该或多或少了解Builder构建者模式。在Builder模式出现之前,构建对象会有如下两个问题:

    1. 在属性过多的情况下,需要在构造函数中一次性传递所有需要初始化的参数,并且可能会根据需求override多个不同参数组合的构造函数。比较麻烦。

    2. 如果是创建一个无参的空对象,通过setter方法,为每一个属性值赋值的话,有一个很大的问题就是会出现对象不一致的情况。也就是说由于setter方法可以在任何时间和地方可以为对象属性重新赋值,可能导致程序上下文对象的属性出现不一致的情况,这在序列化或者多线程的情境下会因为对象不一致而产生bug隐患。

    Builder构建者模式就可以很好的解决上述的两个问题。好了废话不多说,直接上CODE。下面我通过一个Config类,来实现一个构建者模式,其他情况可以参考这个进行相应修改。思路是一致的。

    public class Config {
        private String protocol;
        private String ip;
        private String port;
    
        public String getProtocol() {
            return protocol;
        }
    
        public String getIp() {
            return ip;
        }
    
        public String getPort() {
            return port;
        }
    
        @Override
        public String toString() {
            return "Config{" +
                    "protocol='" + protocol + '\'' +
                    ", ip='" + ip + '\'' +
                    ", port='" + port + '\'' +
                    '}';
        }
    
        //新增Builder静态类并赋默认值
        public static class Builder {
            private String protocol = "http://";
            private String ip = "127.0.0.1";
            private String port = "80";
    
            //为每一个属性创建返回自身Builder对象的方法
            public Builder setProtocol(String protocol) {
                this.protocol = protocol;
                return this;
            }
    
            public Builder setIp(String ip) {
                this.ip = ip;
                return this;
            }
    
            public Builder setPort(String port) {
                this.port = port;
                return this;
            }
    
            //新建一个aplly方法,传一个父类引用,赋值构建的参数
            public void apply2Super(Config config) {
                config.protocol = this.protocol;
                config.ip = this.ip;
                config.port = this.port;
            }
    
            //新建一个build方法,创建一个父类对象,传递给apply方法为这个空对象赋构建出来的参数值,返回这个构建对象即可。
            public Config build(){
                Config config = new Config();
                apply2Super(config);
                return config;
            }
    
        }
    }
    

    调用方式:

            //使用默认值构建
            Config config1 = new Config.Builder().build();
    
            System.out.println(config1);
    
            //自定义构造参数
            Config config = new Config.Builder()
                    .setProtocol("https://")
                    .setIp("192.168.0.1.")
                    .setPort("8080")
                    .build();
    
            System.out.println(config);
    

    总结

    1、在需要构造的类中新增Builder静态类并赋默认值
    2、为每一个属性创建返回自身Builder对象的方法
    3、新建一个aplly方法,传一个父类引用,赋值构建的参数
    4、新建一个build方法,创建一个父类对象,传递给apply方法为这个空对象赋构建出来的参数值,返回这个构建对象即可。

    P.S:
    给大家安利一本书《大话设计模式》 作者是程杰的那个。这本书通俗易懂的讲解了所有的设计模式,是我看到过的所有讲设计模式中,最容易理解,最干净利索的。我现在正在根据书中讲的和我自身的理解,实现每一个设计模式。github地址:https://github.com/longzhiwuing/GOFDemos 欢迎拍砖和STAR

    相关文章

      网友评论

          本文标题:Builder构建者模式 通用模板

          本文链接:https://www.haomeiwen.com/subject/emmybttx.html