1. 程式人生 > >Builder構建者模式 通用模板

Builder構建者模式 通用模板

能看到這篇文章的讀者,我想應該或多或少了解Builder構建者模式。在Builder模式出現之前,構建物件會有如下兩個問題:

  1. 在屬性過多的情況下,需要在建構函式中一次性傳遞所有需要初始化的引數,並且可能會根據需求override多個不同引數組合的建構函式。比較麻煩。

  2. 如果是建立一個無參的空物件,通過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