還為那些設(shè)計(jì)模式煩惱嗎-Builder模式

Builder模式

</br>

前言

從今年的6月份開始畢業(yè)搀菩,到現(xiàn)在,回想到自己看的第三方框架時(shí)候廓块,大多數(shù)都會(huì)有這樣一連串的鏈?zhǔn)酱a:

Glide

 Glide.with(this).
                load(url).
                asBitmap(). 
                into(targetView);

Retrofit

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.reibang.com/users/0e5afd21b574/latest_articles")
        .addConverterFactory(GsonConverterFactory.create())
        .client(new OkHttpClient())
        .build();

看了上面的鏈?zhǔn)降奶一溃?dāng)時(shí)覺得如果學(xué)會(huì)這種模式并應(yīng)用到自己的項(xiàng)目代碼上,必定是一件高端大氣上檔次的事莲绰。
現(xiàn)在欺旧,對(duì)于Builder模式,網(wǎng)上也有好多大神們的demo蛤签,他們都有自己的看法辞友。在此,我只想弱弱地說下我對(duì)這個(gè)模式的看法震肮。(下面我將用一個(gè)形象生動(dòng)的故事來說下對(duì)這個(gè)模式的看法称龙,并且分析這個(gè)故事,再對(duì)Builder模式下定義戳晌,能在什么情況運(yùn)用)</br>


小菜與蒼老師的demo

(高能預(yù)警:下面內(nèi)容與標(biāo)題沒有什么聯(lián)系鲫尊,只是讓大家提高一下興趣心,不過沦偎,相信你們也是純潔的疫向,好了,入主題豪嚎。>_<)</br>
想想到現(xiàn)在搔驼,小菜和蒼老師在一起生活了許久,突然決定要做一個(gè)蛋糕侈询,然后去百度搜了一下做蛋糕舌涨,所需要的簡略材料:水,雞蛋扔字,面粉(不要糾結(jié)做蛋糕的材料泼菌,就三個(gè)就好谍肤,你們懂的,我懶哗伯,想少打代碼荒揣,嘻嘻)。好了焊刹,材料他們已經(jīng)準(zhǔn)備好了系任,接著他們看了一下做蛋糕的秘訣——水量water,雞蛋數(shù)egg虐块,面粉量flour俩滥,還有一個(gè)烘烤蛋糕的時(shí)間time。
他們蛋糕的做法是:
1贺奠、水:1瓢水
2霜旧、雞蛋:1個(gè)
3、面粉:1斤
4儡率、燒烤時(shí)間 :1h</br>


代碼如果下:
/**
 * Created by Jenchar on 2016/8/4.
 */
public class Cake {
    private int water;
    private int egg;
    private int flour;
    private int time;

    public Cake(int water, int egg, int flour, int time) {
        this.water = water;
        this.egg = egg;
        this.flour = flour;
        this.time = time;
    }
    public Cake() {
    }

    public int getWater() {
        return water;
    }

    public void setWater(int water) {
        this.water = water;
    }

    public int getEgg() {
        return egg;
    }

    public void setEgg(int egg) {
        this.egg = egg;
    }

    public int getFlour() {
        return flour;
    }

    public void setFlour(int flour) {
        this.flour = flour;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "Cake{" +
                "water=" + water +
                ", egg=" + egg +
                ", flour=" + flour +
                ", time=" + time +
                '}';
    }
}

Enter.java:

public class Enter {
    public static void main(String[] args) {
        Cake cake=new Cake(1,1,1,1);
    }
}

結(jié)果他們嘗了下做出來蛋糕挂据,發(fā)現(xiàn)不好吃,這下子蒼老師極為不開心儿普,然后幾天都沒“理過他了”(自己理會(huì))崎逃。小菜,為了為蒼老師吃上好吃的蛋糕眉孩,找了一個(gè)蛋糕師父个绍。

改善的蛋糕做法

/**
 * Created by Jenchar on 2016/8/4.
 */
/**
 * Created by Jenchar on 2016/8/4.
 */
public class Cake {
    private int water;
    private int egg;
    private int flour;
    private int time;

    /**
     * 高級(jí)蛋糕師父
     */
    public static class CakeBuilder{
        private int water;
        private int egg;
        private int flour;
        private int time;
        public CakeBuilder() {
        }
        public CakeBuilder setWater(int water){
            this.water=water;
            //返回當(dāng)前CakeBuilder實(shí)例
            return this;
        }
        public CakeBuilder setEgg(int egg){
            this.egg=egg;
            //返回當(dāng)前CakeBuilder實(shí)例
            return this;
        }
        public CakeBuilder setFlour(int flour){
            this.flour=flour;
            //返回當(dāng)前CakeBuilder實(shí)例
            return this;
        }
        public CakeBuilder setTime(int time){
            this.time=time;
            //返回當(dāng)前CakeBuilder實(shí)例
            return this;
        }
        //高級(jí)蛋糕師父根據(jù)自己的材料分量,直接幫你做出一個(gè)好吃的蛋糕
        public Cake builer(){
            return new Cake(this);
        }
    }

    /**
     * 蛋糕的構(gòu)造方法
     * @param mCakeBuilder 蛋糕的材料分量
     */
    public Cake(CakeBuilder mCakeBuilder) {
        this.water = mCakeBuilder.water;
        this.egg = mCakeBuilder.egg;
        this.flour = mCakeBuilder.flour;
        this.time = mCakeBuilder.time;
    }
    /**
     *   只能通過高級(jí)蛋糕師父的指定蛋糕材料分量來做蛋糕浪汪,即pulbic Cake(CakeBuilder mCakeBuilder)巴柿,
     *   不讓其他非專業(yè)人士,直接做蛋糕給客戶吃
     */
    private Cake(){
    }
}

Enter.java:

public class Enter {
    public static void main(String[] args) {

       Cake.CakeBuilder
                cakeBuilder=new Cake.CakeBuilder().
                setWater(1).
                        setEgg(2).
                            setFlour(1).
                                setTime(1);
        Cake cake=new Cake(cakeBuilder);
        /*Cake cake=new Cake.CakeBuilder().
                setWater(1).
                setEgg(2).
                setFlout(1).
                setTime(1).builer();*/
    }
}

從此小菜與蒼老師因?yàn)槌陨虾贸缘牡案馑涝猓俅芜^上了幸福的生活篮洁。


小結(jié)

看上面Enter.java類,做蛋糕師父(CakeBuilder)把做蛋糕的材料分量殃姓,water=1,egg=2,flour=1,time=1,傳送Cake的構(gòu)造方法,然后瓦阐,這個(gè)蛋糕因?yàn)楸刃〔伺c蒼老師的egg=1多放了一個(gè)蜗侈,變得好吃了∷看看Lせ谩!放的量戳杀,小菜與蒼老師是不知道的该面,假設(shè)蛋糕師父不放水夭苗,water=0:

 Cake.CakeBuilder
                cakeBuilder=new Cake.CakeBuilder().
                        setEgg(2).//沒放水了
                            setFlour(1).
                                setTime(1);

再看看,相比上面的小菜與蒼老師做的蛋糕 隔缀,Cake cake=new Cake(1,1,1,1)题造,構(gòu)造過程一下就給人知道你想做什么了,而且這個(gè)構(gòu)造方法寫死猾瘸,沒有靈活之分界赔,而蛋糕大師的做法,想放水牵触,就放水淮悼,想不放,就可以修改不放揽思,其他材料分量也是一樣袜腥。</br>


定義

復(fù)雜的對(duì)象的構(gòu)建(想下蛋糕的構(gòu)建new Cake(1,1,1,1))與它的表示分離(new Cake.CakeBuilder().setWater(1).setEgg(2).setFlout(1).setTime(1).builer(),即分離了钉汗,想放水就放水)羹令。</br>


使用情景

1、當(dāng)初始化一個(gè)對(duì)象特別復(fù)雜儡湾,如參數(shù)多特恬,且很多參數(shù)都具有默認(rèn)值的時(shí)。(上面的蛋糕師父CakeBuilder里面可以設(shè)置默認(rèn)值徐钠,不設(shè)就全部為0)</br>
2癌刽、當(dāng)一個(gè)類的構(gòu)建,想隱藏的構(gòu)建細(xì)節(jié)尝丐。</br>
3显拜、相同的方法,不同的執(zhí)行順序爹袁,產(chǎn)生不同的事件結(jié)果远荠。(上面的例子,沒有體現(xiàn)出來失息,你可以這樣想譬淳,隱藏了構(gòu)建的細(xì)節(jié),從而你無法知道結(jié)果如何盹兢,所以產(chǎn)生了不同的事件結(jié)果)</br>


喜歡我的朋友邻梆,可以與我一起討論問題,我也是學(xué)習(xí)者绎秒,希望與大學(xué)一起學(xué)習(xí)浦妄,共同進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剂娄,隨后出現(xiàn)的幾起案子蠢涝,更是在濱河造成了極大的恐慌,老刑警劉巖阅懦,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件和二,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡故黑,警方通過查閱死者的電腦和手機(jī)儿咱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來场晶,“玉大人混埠,你說我怎么就攤上這事∈幔” “怎么了钳宪?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扳炬。 經(jīng)常有香客問我吏颖,道長,這世上最難降的妖魔是什么恨樟? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任半醉,我火速辦了婚禮,結(jié)果婚禮上劝术,老公的妹妹穿的比我還像新娘缩多。我一直安慰自己,他們只是感情好养晋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布衬吆。 她就那樣靜靜地躺著,像睡著了一般绳泉。 火紅的嫁衣襯著肌膚如雪逊抡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天零酪,我揣著相機(jī)與錄音冒嫡,去河邊找鬼。 笑死四苇,一個(gè)胖子當(dāng)著我的面吹牛孝凌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛔琅,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了罗售?” 一聲冷哼從身側(cè)響起辜窑,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寨躁,沒想到半個(gè)月后穆碎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡职恳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年所禀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放钦。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡色徘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出操禀,到底是詐尸還是另有隱情褂策,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布颓屑,位于F島的核電站斤寂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揪惦。R本人自食惡果不足惜遍搞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望器腋。 院中可真熱鬧溪猿,春花似錦、人聲如沸蒂培。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽护戳。三九已至翎冲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媳荒,已是汗流浹背抗悍。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钳枕,地道東北人缴渊。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像鱼炒,于是被迫代替她去往敵國和親衔沼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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