Builder模式
</br>
前言
從今年的6月份開始畢業(yè)搀菩,到現(xiàn)在,回想到自己看的第三方框架時(shí)候廓块,大多數(shù)都會(huì)有這樣一連串的鏈?zhǔn)酱a:
Glide.with(this).
load(url).
asBitmap().
into(targetView);
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)步。