android里很多对象的构建都用到了Builder,比如OkHttp和AlertDialog,看起来特别简洁直观。
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
网上的定义如下
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
下面举个例子来看看
过年嘛,被问的最多的就是为毛还单身,,单身狗说多了都是泪啊,怕什么!!我写java,我还怕没对象?!我现在就来创建一个
Person类
public abstract class Person {
protected int age;
protected String hobby;
protected String character;
public Person() {
}
public abstract void setAge(int age);
public abstract void setHobby(String hobby);
public abstract void setCharacter(String character);
}
Boyfriend
public class Boyfriend extends Person {
public Boyfriend() {
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void setHobby(String hobby) {
this.hobby = hobby;
}
@Override
public void setCharacter(String character) {
this.character = character;
}
@Override
public String toString() {
String string = "boyfriend: age = " + age + "\nhobby=" + hobby + "\ncharacter=" + character;
return string;
}
}
Builder
public abstract class Builder {
public abstract Builder buildAge(int age);
public abstract Builder buildHobby(String hobby);
public abstract Builder buildCharacter(String character);
public abstract Person create();
}
BoyfriendBuilder
public class BoyFriendBuilder extends Builder {
private Boyfriend boyfriend;
public BoyFriendBuilder() {
boyfriend = new Boyfriend();
}
@Override
public Builder buildAge(int age) {
boyfriend.setAge(age);
return this;
}
@Override
public Builder buildHobby(String hobby) {
boyfriend.setHobby(hobby);
return this;
}
@Override
public Builder buildCharacter(String character) {
boyfriend.setCharacter(character);
return this;
}
@Override
public Person create() {
return boyfriend;
}
}
最后建个SingleDog来测试下
public class SingleDog {
public static void main(String[] args) {
Person boyfriend = new BoyFriendBuilder()
.buildAge(20)
.buildCharacter("gentle")
.buildHobby("coding")
.create();
System.out.println(boyfriend.toString());
}
}
输出:
boyfriend: age = 20
hobby=coding
character=gentle
哼!我也是个有对象的人,想建几个建几个,还有可以添加各种属性。╭(╯^╰)╮
OKHttp中的Builder模式
OKHttp的使用
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
看一下Request的代码
public final class Request {
private Request(Builder builder) {
this.url = builder.url;
this.method = builder.method;
this.headers = builder.headers.build();
this.body = builder.body;
this.tag = builder.tag != null ? builder.tag : this;
}
//...
public static class Builder {
private HttpUrl url;
private String method;
private Headers.Builder headers;
private RequestBody body;
private Object tag;
public Builder() {
this.method = "GET";
this.headers = new Headers.Builder();
}
private Builder(Request request) {
this.url = request.url;
this.method = request.method;
this.body = request.body;
this.tag = request.tag;
this.headers = request.headers.newBuilder();
}
public Builder url(HttpUrl url) {
if (url == null) throw new IllegalArgumentException("url == null");
this.url = url;
return this;
}
//...
public Builder tag(Object tag) {
this.tag = tag;
return this;
}
public Request build() {
if (url == null) throw new IllegalStateException("url == null");
return new Request(this);
}
}
}
Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)。再将这个builder对象传递给在build()中创建的request,request利用这个Builder设置各种参数。
定义一个静态内部类Builder,内部的成员变量和外部类一样
Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值