設計模式之構(gòu)建者模式(Builder)


先不介紹Builder使用場景,通過擼碼的方式簡單粗暴译隘。


業(yè)務需求:

現(xiàn)有PersonInfo對象亲桥,ta有姓名,年齡(必參)基本信息,
還有一下愛好固耘,電話题篷,地址(可選),通過編程實現(xiàn)做一個自我介紹厅目。

分析業(yè)務需求番枚,挖掘信息:

從業(yè)務需求可以知道 name(姓名)age(年齡)法严,屬于必要參數(shù),hobby(愛好) phone(電話) address(地址)屬于可選參數(shù)葫笼。


實現(xiàn)
public class PersonInfo {
    //必要參數(shù)
    private String name;    //姓名
    private int age;        //年齡
   
    //可選參數(shù) 
    private String hobby;  //愛好
    private  String phone;  //電話
    private  String address;  //地址
    
    
    //在實際開發(fā)中深啤,遇到這樣必傳的參數(shù),一般是這樣做
    public PersonInfo(){
        
    }
    
    //做法一:必參放構(gòu)造器中傳值
    public   PersonInfo(String name,int age){
        this.name =name;
        this.age =age;
    }

    //做法二:必參和可選 放一起通過構(gòu)造器傳值
    public PersonInfo(String name, int age, String hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }
    //做法二:必參和可選 放一起通過構(gòu)造器傳值
    public PersonInfo(String name, int age, String hobby, String phone) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
        this.phone = phone;
    }
    //做法二:必參和可選 放一起通過構(gòu)造器傳值
    public PersonInfo(String name, int age, String hobby, String phone, String address) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
        this.phone = phone;
        this.address = address;
    }
    //----------------------下面是 get   set方法賦值-------------------------

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "我叫:"+name+"今年"+age+",喜歡:"+hobby+",電話是:"+phone+",住在:"+address;
    }
}


調(diào)用及打印結(jié)果:

        // 做法一 通過重疊構(gòu)造器直接賦值路星,
        PersonInfo info=new PersonInfo("張三",11,"喜歡吃雞");
        PersonInfo info1=new PersonInfo("張三",11,"喜歡吃雞","110110");
        PersonInfo info2=new PersonInfo("張三",11,"喜歡吃雞","110110","魔都");
        
        //做法二:通過get  set 賦值
        PersonInfo info3 =new PersonInfo();
        info3.setName("李四");
        info3.setAge(22);
        info3.setHobby("喜歡小姐姐");
        info3.setPhone("120120");
        info3.setAddress("魔都");
        
        //
        Log.d("toString",info.toString());
        Log.d("toString",info1.toString());
        Log.d("toString",info2.toString());
        Log.d("toString",info3.toString());
我叫:張三今年11,喜歡:喜歡吃雞,電話是:null,住在:null
我叫:張三今年11,喜歡:喜歡吃雞,電話是:110110,住在:null
我叫:張三今年11,喜歡:喜歡吃雞,電話是:110110,住在:魔都
我叫:李四今年22,喜歡:喜歡小姐姐,電話是:120120,住在:魔都

通過打印結(jié)果溯街,完美的實現(xiàn)了自我介紹,來看看我們是如何實現(xiàn)的洋丐,通過代碼呈昔,很容易看出是通過構(gòu)造方法直接賦值(一般常用的寫法,直接構(gòu)造方法賦值)友绝,或者通過 get set 方法賦值橄唬,java 基礎(chǔ)面向?qū)ο髮崿F(xiàn)疾棵,似乎么有啥毛病。接著往下看


Builder模式(推薦)
public class PersonInfo {
    

    //必要參數(shù)
    private String name;    //姓名
    private int age;        //年齡

    //可選參數(shù) 
    private String hobby;  //愛好
    private String phone;  //電話
    private String address;  //地址


    private PersonInfo(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.hobby = builder.hobby;
        this.phone = builder.phone;
        this.address = builder.address;
    }


    //定義一個Builder類
    public static class Builder {
        //必要參數(shù)
        private String name;    //姓名
        private int age;        //年齡

        //可選參數(shù) 
        private String hobby;  //愛好
        private String phone;  //電話
        private String address;  //地址

        //把必參 料皇,可選參數(shù)分開咬腕,很重要哦
        public Builder(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public Builder setHobby(String hobby) {
            this.hobby = hobby;
            return this;
        }

        public Builder setPhone(String phone) {
            this.phone = phone;
            return this;
        }


        public Builder setAddress(String address) {
            this.address = address;
            return this;

        }

        
        public PersonInfo build() {
            return new PersonInfo(this);
        }
    }

    @Override
    public String toString() {
        return "Builder實現(xiàn)--->我叫:"+name+"今年"+age+",喜歡:"+hobby+",電話是:"+phone+",住在:"+address;
    }
}

調(diào)用及打印結(jié)果:

        PersonInfo info=new PersonInfo.Builder("李四",11)
                .setHobby("喜歡小姐姐")
                .setPhone("110110")
                .setAddress("魔都")
                .build();

Builder實現(xiàn)--->我叫:李四今年11,喜歡:喜歡小姐姐,電話是:110110,住在:魔都

對比一下進行一個優(yōu)劣性分析:

看看兩種調(diào)用方式:

一般的套路:優(yōu)點是比較簡單咏删,開發(fā)效率高秦士,缺點是如果參數(shù)真的很多的話鬼知道每個對應的是什么意思啊舷夺。(必參,跟可選都在構(gòu)造器里面一把擼過去了)

Builder模式:優(yōu)點:分離必要跟次要(這里指必參跟可選)切威,可讀性較高。
缺點:比較冗長丙号。明明可以簡單粗暴的方式實現(xiàn)先朦,非得裝個逼。

截圖對比:


yhx.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犬缨,一起剝皮案震驚了整個濱河市喳魏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怀薛,老刑警劉巖刺彩,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枝恋,居然都是意外死亡创倔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門焚碌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畦攘,“玉大人,你說我怎么就攤上這事十电≈海” “怎么了叹螟?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長台盯。 經(jīng)常有香客問我罢绽,道長,這世上最難降的妖魔是什么静盅? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任良价,我火速辦了婚禮,結(jié)果婚禮上温亲,老公的妹妹穿的比我還像新娘棚壁。我一直安慰自己,他們只是感情好栈虚,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布袖外。 她就那樣靜靜地躺著,像睡著了一般魂务。 火紅的嫁衣襯著肌膚如雪曼验。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天粘姜,我揣著相機與錄音鬓照,去河邊找鬼。 笑死孤紧,一個胖子當著我的面吹牛豺裆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号显,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼臭猜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了押蚤?” 一聲冷哼從身側(cè)響起蔑歌,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揽碘,沒想到半個月后次屠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡雳刺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年劫灶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掖桦。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑此,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滞详,到底是詐尸還是另有隱情凛俱,我是刑警寧澤紊馏,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蒲犬,受9級特大地震影響朱监,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜原叮,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一赫编、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奋隶,春花似錦擂送、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至境氢,卻和暖如春蟀拷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萍聊。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工问芬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寿桨。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓此衅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亭螟。 傳聞我的和親對象是個殘疾皇子挡鞍,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容