建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。 java
簡單來講,建造者模式經過一步步的設置(構建)對象的值,最終構建了一個對象。設計模式
經常使用場景以下:數組
好比一個對象的參數過多,經過構造函數來建立,很是繁瑣切可讀性差,例以下面的僞代碼:併發
public class Obj { public Obj(10個參數) { ... } } // 使用 Obj obj = new Obj(1,2,3,4,5,6,7,8,9,10);
寫起來麻煩,讀起來不清晰,要記得第幾個參數表明那個字段,通常超過3個參數就不太好記了。ide
此外,Sonarlint等代碼質量檢測工具也會把這種長參數的構造函數定義爲壞味道。函數
還有,就是構件對象特別靈活,例以下面僞代碼:工具
public class Obj { public Obj(int a, int b) { ... } public Obj(int a, float c) { ... } public Obj(int b, double d) { ... } .... }
這種不一樣參數列表的構造函數,寫起來也很複雜,讀起來很困難。以上的狀況均可以用建造者模式去解決。ui
定義一個可使用建造者模式的需求,而後用Java語言來實現。this
例如,要開發一個表明Http返回值的業務對象,這個對象須要4個屬性:spa
每次返回時,要求code和desc是必填項,msg和data爲選填項(可都不返回,可只返回一個,或者返回兩個)。
下面用建造者模式來建立這個對象:
代碼以下:
public class HttpResult<T> { /** * 構造函數。 */ private HttpResult() { } /** * 構造函數。 * * @param builder 建造者。 */ private HttpResult(Builder<T> builder) { this.code = builder.status.getCode(); this.desc = builder.status.getDesc(); this.msg = builder.msg; this.data = builder.data; } /** * @return 得到返回代碼值。 */ public int getCode() { return code; } /** * @return 得到返回代碼描述。 */ public String getDesc() { return desc; } /** * @return 得到響應消息。 */ public String getMsg() { return msg; } /** * @return 得到響應數據。 */ public T getData() { return data; } /** * @return 重寫toString()方法。 */ @Override public String toString() { return "HttpResult{" + "code=" + code + ", desc='" + desc + '\'' + ", msg='" + msg + '\'' + ", data=" + data + '}'; } /** * HttpResult的構造器。 * * @author xuepeng */ public static class Builder<K> { /** * 構造函數。 * * @param status 返回狀態。 */ public Builder(HttpResultStatus status) { this.status = status; } /** * 設置返回消息。 * * @param msg 返回消息。 * @return HttpResult.Builder對象。 */ public Builder<K> msg(String msg) { this.msg = msg; return this; } /** * 設置返回數據。 * * @param data 返回數據。 * @return HttpResult.Builder對象。 */ public Builder<K> data(K data) { this.data = data; return this; } /** * 建立HttpResultEntity對象。 * * @return HttpResultEntity對象。 */ public HttpResult<K> build() { return new HttpResult<>(this); } /** * @return 重寫toString()方法。 */ @Override public String toString() { return "Builder{" + "status=" + status + ", msg='" + msg + '\'' + ", data=" + data + '}'; } /** * 返回狀態。 */ private HttpResultStatus status; /** * 返回消息。 */ private String msg; /** * 返回數據。 */ private K data; } /** * 返回代碼值。 */ private int code; /** * 返回代碼描述。 */ private String desc; /** * 返回消息。 */ private String msg = StringUtils.EMPTY; /** * 返回數據。 */ private T data; }
上面類就是一個HttpResult的對象,經過建造者模式去建立,主要作了以下事情:
上面就是建造者模式的幾個核心點,建造者模式的使用方式以下:
// 填寫所有參數 public static <T> HttpResult<T> success(String msg, T data) { return new HttpResult.Builder<T>(SUCCESS) .msg(msg) .data(data) .build(); } // 填寫1個可選參數 public static <T> HttpResult<T> success(String msg, T data) { return new HttpResult.Builder<T>(SUCCESS) .msg(msg) .build(); } // 不填寫可選參數 public static <T> HttpResult<T> success(String msg, T data) { return new HttpResult.Builder<T>(SUCCESS).build(); }
建造者模式的好處:
建造者模式與其餘用來建立對象的設計模式的不一樣點在於,它關注的是經過一步步的構建來建立一個對象,且對象的步驟能夠隨意改變
以上就是我對建造者模式的一些理解,有不足之處請你們指出,謝謝。