Builder構建者模式 通用模板
阿新 • • 發佈:2019-02-09
能看到這篇文章的讀者,我想應該或多或少了解Builder構建者模式。在Builder模式出現之前,構建物件會有如下兩個問題:
在屬性過多的情況下,需要在建構函式中一次性傳遞所有需要初始化的引數,並且可能會根據需求override多個不同引數組合的建構函式。比較麻煩。
如果是建立一個無參的空物件,通過setter方法,為每一個屬性值賦值的話,有一個很大的問題就是會出現物件不一致的情況。也就是說由於setter方法可以在任何時間和地方可以為物件屬性重新賦值,可能導致程式上下文物件的屬性出現不一致的情況,這在序列化或者多執行緒的情境下會因為物件不一致而產生bug隱患。
Builder構建者模式就可以很好的解決上述的兩個問題。好了廢話不多說,直接上CODE。下面我通過一個Config類,來實現一個構建者模式,其他情況可以參考這個進行相應修改。思路是一致的。
public class Config {
private String protocol;
private String ip;
private String port;
public String getProtocol() {
return protocol;
}
public String getIp() {
return ip;
}
public String getPort() {
return port;
}
@Override
public String toString() {
return "Config{" +
"protocol='" + protocol + '\'' +
", ip='" + ip + '\'' +
", port='" + port + '\'' +
'}';
}
//新增Builder靜態類並賦預設值
public static class Builder {
private String protocol = "http://" ;
private String ip = "127.0.0.1";
private String port = "80";
//為每一個屬性建立返回自身Builder物件的方法
public Builder setProtocol(String protocol) {
this.protocol = protocol;
return this;
}
public Builder setIp(String ip) {
this.ip = ip;
return this;
}
public Builder setPort(String port) {
this.port = port;
return this;
}
//新建一個aplly方法,傳一個父類引用,賦值構建的引數
public void apply2Super(Config config) {
config.protocol = this.protocol;
config.ip = this.ip;
config.port = this.port;
}
//新建一個build方法,建立一個父類物件,傳遞給apply方法為這個空物件賦構建出來的引數值,返回這個構建物件即可。
public Config build(){
Config config = new Config();
apply2Super(config);
return config;
}
}
}
呼叫方式:
//使用預設值構建
Config config1 = new Config.Builder().build();
System.out.println(config1);
//自定義構造引數
Config config = new Config.Builder()
.setProtocol("https://")
.setIp("192.168.0.1.")
.setPort("8080")
.build();
System.out.println(config);
總結
1、在需要構造的類中新增Builder靜態類並賦預設值
2、為每一個屬性建立返回自身Builder物件的方法
3、新建一個aplly方法,傳一個父類引用,賦值構建的引數
4、新建一個build方法,建立一個父類物件,傳遞給apply方法為這個空物件賦構建出來的引數值,返回這個構建物件即可。
P.S:
給大家安利一本書《大話設計模式》 作者是程傑的那個。這本書通俗易懂的講解了所有的設計模式,是我看到過的所有講設計模式中,最容易理解,最乾淨利索的。我現在正在根據書中講的和我自身的理解,實現每一個設計模式。github地址:https://github.com/longzhiwuing/GOFDemos 歡迎拍磚和STAR