看了 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 里静态方法的使用。
















暂无评论内容