Builder 模式代码实现模板

看了 Retrofit,Picasso 的源码,感觉 Builder 模式还是挺常用的,如果我们自己写代码,想用上 Builder 模式,该怎么写会标准,好看些呢?于是我想着从这些源码里 抄 学习一下,形成固定格式,后来就这么写,说不定写多了自然就融汇贯通了。

第一 如果要对一个类对象的创建利用 Builder 模式,为了代码相关性及结合的更紧密,就在类文件里创建公有静态类 Builder,

public class DaVinci {
    
    public static class Builder {
        
    }
}

然后 Builder 类里需要定义一些成员属性,通过方法去设值,并且这些设值方法都要有返回值,且都返回当前 Builder 对象,这样才能像链式调用那些,优点就是好写,看着也舒服。

public class DaVinci {
    
    public static class Builder {
        private Property value1;
        private Listener listener;
     
        public Builder() {}
        
        public Builder listener(Listener listener) {
            this.listener = listener;
            return this;
        }
        
        public Builder setProperty(Property value) {
            this.value1 = value;
            return this;
        }
    }
}

接着 就是关键一步 build() 方法的调用,前面配置好了属性,通过 build() 方法创建出一个我们想要的对象,所以 build() 方法里要将前面配置的属性赋值,并返回新对象。如果配置的属性许多,可以直接将 Builder 对象作为入参传递,这样通过 Builder 对象访问相应属性并赋值。

public class DaVinci {
    private Property v;
    private Listener l;
    
    DaVinci(Property value, Listener listener) {
        v = value;
        l = listener;
    }
    
    public static class Builder {
        private Property value1;
        private Listener listener;
     
        public Builder() {}
        
        public Builder listener(Listener listener) {
            this.listener = listener;
            return this;
        }
        
        public Builder setProperty(Property value) {
            this.value1 = value;
            return this;
        }
        
        public DaVinci build() {
            return new DaVinci(value1, listener);
        }
    }
}

最后 可以在 DaVinci 里提供一个方法,用来快速创建 DaVinci 对象,或者不提供,根据实际情况用 Builder 配置创建。

public static DaVinci get() {
    return new Builder()
        .setProperty("xxx")
        .build();
}

格式差不多就是这样了,具体可以再对比下 Picasso 和 OkHttpClient 的代码实现。

以上是 Java 的写法,针对 Kotlin 也做了转换实现,

class DaVinci {
    
    class Builder {
        
    }
}

在 Kotlin 里类默认是 public final 的,并且向上面这些的嵌套,实则 Builder 类并不像 Java 里那样持有外部类对象引用,所以就不用想 Java 那样用 static 了(况且 Kotlin 里也没有 static)

class DaVinci(private val v: Property, private val l: Listener) {
    
    class Builder {
        private lateinit var value1: Property
        private lateinit var listener: Listener
        
        init{}
        
        fun setProperty(v: Property): Builder {
            value1 = v
            return this
        }
        
        fun listener(l: Listener): Builder {
            listener = l
            return this
        }
        
        fun build(): DaVinci {
            return DaVinci(value1, listener)
        }
    }
}

在成员属性及构造方法初始化上,Kotlin 有自己的实现方式,这个要留意,

companion object {
    fun getDaVinci(): DaVinci {
        return Builder()
        .setProperty("xxx")
        .build()
    }
}

由于 Kotlin 没有 static 关键字,用于实现一样效果的是伴生对象,调用起来就如同 Java 里静态方法的使用。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容