優(yōu)化建造者模式

參考鏈接

一、問(wèn)題示例

  public void func(String name, String id, String gender, String fullname, long time, boolean flag, Object body){
        //具體業(yè)務(wù)
    }

可以看到該方法參數(shù)多達(dá)七個(gè),并且前四個(gè)都是String類型,使用者很容易在傳入?yún)?shù)的時(shí)候搞錯(cuò)順序。

二、解決辦法

使用建造者模式構(gòu)建一個(gè)Params類,用來(lái)管理所有的入?yún)ⅰ4a結(jié)構(gòu)如下:

public class Params {
    private String name;
    private String id;
    private String gender;
    private String fullname;
    private long time;
    private boolean flag;
    private Object body;
    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

    public String getGender() {
        return gender;
    }

    public String getFullname() {
        return fullname;
    }

    public long getTime() {
        return time;
    }

    public boolean isFlag() {
        return flag;
    }

    public Object getBody() {
        return body;
    }

    private Params(String name, String id, String gender, String fullname,
            long time, boolean flag, Object body) {
        this.name = name;
        this.id = id;
        this.gender = gender;
        this.fullname = fullname;
        this.time = time;
        this.flag = flag;
        this.body = body;
    }
    public static class Builder{
        private String name;
        private String id;
        private String gender;
        private String fullname;
        private Long time;
        private Boolean flag;
        private Object body;
        private Builder(){
        }
        public static Builder build(){
            return new Builder();
        }
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        public Builder setId(String id) {
            this.id = id;
            return this;
            
        }
        public Builder setGender(String gender) {
            this.gender = gender;
            return this;
        }
        public Builder setFullname(String fullname) {
            this.fullname = fullname;
            return this;
        }
        public Builder setTime(long time) {
            this.time = time;
            return this;
        }
        public Builder setFlag(boolean flag) {
            this.flag = flag;
            return this;
        }
        public Builder setBody(Object body) {
            this.body = body;
            return this;
        }
        public Params create(){
            if (name != null && gender != null && flag != null && id != null) {
                return new Params(name, id, gender, fullname, time, flag, body);
            } else {
                return null;
            }
        }
        
    }

}

該代碼和一般的建造者模式不同在于:

1.對(duì)于long等基本類型,在Builder類的成員變量中全都使用其包裝類。其作用在于識(shí)別用戶是否執(zhí)行了Builder中的setXxxx()接口。
2.對(duì)于所有必傳參數(shù),在Builder類的create()方法中檢測(cè)是否為null,檢測(cè)構(gòu)建過(guò)程中是否使用了必須的setXxxx()接口。
3.所有的類的構(gòu)造函數(shù)都私有化,防止用戶直接創(chuàng)建,繞過(guò)檢測(cè)。

4.func方法需要修改成如下方式,必須有布爾型返回值,用來(lái)標(biāo)識(shí)參數(shù)是否漏傳。

public boolean func(Params params){
        if(params==null){
            return false;
        }
        //具體業(yè)務(wù)
        return true;
    }

三、使用比較

//優(yōu)化前
func("xiaoli","12344455","man","li ming",System.currentTimeMillis(),true,null);
//優(yōu)化后
func(Params.Builder.build().setBody(null).setFlag(true).setTime(System.currentTimeMillis()).setFullname("li ming").setName("xiaoli").setGender("man").setId("12344455").create());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容