建造者模式主要解决的是创建对象的时候,对象属性的初始化问题。一个类有很多属性,而这些属性在创建的时候可以赋值也可以不赋值。如果我们单纯的用构造器来解决就会很麻烦,这个时候建造者模式就非常适用了。
我们拿现在比较流行的OkHttp的Request类来作为范本来说明建造者模式
public final class Request
{
//外部类的属性
final HttpUrl url;
final String method;
final Headers headers;
final RequestBody body;
final Map<Class<?>,Object> tags;
//定义一个需要传入建造者的构造器
Request(Builder builder)
{
this.url = builder.url;
this.method = builder.method;
this.headers = builder.headers.build();
this.body = builder.body;
this.tags = Util.immutableMap(builder.tags);
}
public static class Builder
{
//静态建造器内部类有与外部类相同属性
HttpUrl url;
String method;
Headers.Builder headers;
RequestBody body;
Map<Class<?>, Object> tags = Collections.emptyMap();
public Builder() {}
//定义对属性赋值并返回相应建造器的方法
public Builder url(HttpUrl url)
{
this.url = url;
return this;
}
public Builder headers(Headers headers)
{
this.headers = headers;
return this;
}
.
.
.
//创建方法
public Request build()
{
return new Request(this);
}
}
}
//适用的时候就很简单了,根据自己的需要通过建造器创建Request
public class TestActivity extends Activity
{
protected void onCreate(Bundle savedInstanceState)
{
Request request = Request.Builder()
.url(new HttpUrl())
.headers(new Headers())
.build()
//拿到建造器后对需要赋值的属性进行赋值,最后调用build()方法
}
}
上面已经是我对Okhttp的Request进行了很多删减后的,目的在于将建造者模式提炼的更加清晰可见。