1. Builder 模式的簡單實現(xiàn)(書中例子)
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
protected Computer() {
}
public void setBoard(String board) {
mBoard = board;
}
public void setDisplay(String display) {
mDisplay = display;
}
public abstract void setOS();
}
public class Macbook extends Computer {
protected Macbook() {
}
@Override
public void setOS() {
mOS = "Mac OS X";
}
}
public abstract class Builder {
public abstract void buildBoard(String board);
public abstract void buildDisplay(String display);
public abstract void buildOS();
public abstract Computer create();
}
public class MacbookBuilder extends Builder {
private Computer mComputer = new Macbook();
@Override
public void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
public void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
public void buildOS() {
mComputer.setOS();
}
@Override
public Computer create() {
return mComputer;
}
}
public class Director {
Builder mBuilder;
public Director(Builder builder) {
mBuilder = builder;
}
public void construct(String board, String display) {
mBuilder.buildBoard(board);
mBuilder.buildDisplay(display);
mBuilder.buildOS();
}
}
書中給出的 Builder 模式實現(xiàn)灌旧,最終通過調用 Director
對象的 construct() 方法來構建 Computer
坪哄,在學習工作中彰触,我們經(jīng)常能看到 Builder 模式的另一種實現(xiàn)模式梯投,直接通過鏈式調用 Builder
對象來構建。下面以 OkHttp 中的 Request Builder 舉例况毅,來看看他是怎么實現(xiàn) Builder 模式的分蓖。
public static class Builder {
HttpUrl url;
String method;
Headers.Builder headers;
RequestBody body;
Object tag;
public Builder() {
this.method = "GET";
this.headers = new Headers.Builder();
}
Builder(Request request) {
this.url = request.url;
this.method = request.method;
this.body = request.body;
this.tag = request.tag;
this.headers = request.headers.newBuilder();
}
// Builder 的 set 方法,都會返回 Builder 自己尔许,這樣就可以鏈式調用
public Builder url(HttpUrl url) {
if (url == null) throw new NullPointerException("url == null");
this.url = url;
return this;
}
// ……
// 最后構建的時候咆疗,將 Builder 對象自身作為 Request 構造方法參數(shù)傳入,Request 通過提取 Builder 對象中的屬性母债,來構建自身
public Request build() {
if (url == null) throw new IllegalStateException("url == null");
return new Request(this);
}
}