![版本1.0.0](
>建造者在android上這幾年非常流行,無論是第三方庫還是第三方控制項很多都採用建造者模式,再加上鏈式呼叫用起來用起來真是爽的一逼。
##什麼是建造者模式
使用多個簡單的物件一步一步構建成乙個複雜的物件,他允許使用者在不知道內部構建細節的情況下,可以更精細的控制物件的構造流程,這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
##為什麼要使用建造者
乙個複雜的物件有很多大量組成部分,如汽車,有輪子,方向盤,發動機等一系列部件裝配成一輛汽車,這個裝配過程很複雜且漫長,對於這種情況,為了在構建的過程中對外部隱藏實現的細節,就可以用builder模式將部件和組裝過程分離。建造者模式則是將各種產品集中起來進行管理,用來建立復合物件。建立某個物件時,需要設定很多的引數通過get,set,但是這些引數必須按照某個順序設定,或者是設定步驟不同會得到不同的結果
##建造者的uml圖
![uml](
##怎麼使用
1. 這裡以汽車為例子,然後把汽車組裝的過程抽象出來
```public class car
public void setlicenseplate(string licenseplate)
public void setbrand(string brand)
@override
public string tostring() {}
```2. 建立builder的介面
```public inte***ce builder
```3. 建立實現類
```public class carbuilder implements builder
@override
public void buildcolor(string color)
@override
public void buildlicenseplate(string licenseplate)
@override
public void buildbrand(string brand)
@override
public car build()
}```
4. 最後產品組裝類
```public class director
public void construct(string color, string licenseplate, string brand)
}```
5. 測試程式
```builder builder = new carbuilder();
director director =new director(builder);
director.construct("red", "a88888", "ferrari");
mshowtext.settext(builder.build().tostring());
```上面**中,通過具體的carbuilder來構建car物件,而director封裝了構建複雜產品物件的過程,對外隱藏了構建細節。最後在android開發當中director這個角色經常會被省掉,而是直接使用builder來進行物件的封裝,這個builder通常為鏈式呼叫,他的關鍵點就是每個setter方法都會返回自身。
簡化版1(保留介面)
```public inte***ce builder
public class carbuilder implements builder
@override
public builder buildcolor(string color)
@override
public builder buildlicenseplate(string licenseplate)
@override
public builder buildbrand(string brand)
@override
public car build()
public string tostring()
}public class car
public void setlicenseplate(string licenseplate)
public void setbrand(string brand)
@override
public string tostring() ';}}
//呼叫方式
builder builder = new carbuilder()
.buildcolor("blue")
.buildlicenseplate("d66666")
.buildbrand("吉利");
log.d("test",builder.tostring());
```簡化版2(去除介面)
```public class car
public static class builder
public builder setlicenseplate(string licenseplate)
public builder setbrand(string brand)
/*** 最終構建方法,返回乙個 car 物件,引數是當前 builder 物件
* @return
*/public car build()
@override
public string tostring() ';}}
//呼叫方式
car.builder builder = new car.builder();
builder.setcolor("yellow")
.setbrand("蘭博基尼")
.setlicenseplate("d12345");
log.d("test",builder.tostring());
```android原始碼中的使用 在android當中使用builder最經典就是對話方塊alertdialog,和通知欄notification了。首先來看看對話方塊是如何使用的。
```alertdialog.builder builder = new alertdialog.builder(context);
builder.seticon(r.drawable.icon);
builder.settitle("標題");
builder.setmessage("顯示的內容");
builder.setpositivebutton("確定",
new dialoginte***ce.onclicklistener()
});
builder.setneutralbutton("忽",
new dialoginte***ce.onclicklistener()
});
builder.setnegativebutton("取消",
new dialoginte***ce.onclicklistener()
});
builder.create().show();
```看到builder.set***是不是跟我們上面那個簡化版的一樣,內部維護著乙個builder。我們通過原始碼看看裡面是否維護著乙個builder。
![源**](
很顯然裡面確實維護著builder,看到這個寫法了嗎?是不是跟上面那簡化版的寫法一樣。
Android之Builder建造者模式
在我們日常研發中,建造者模式是使用的很多的一種模式。其實很多時候我們在不知不覺中就使用了別人設計的建造者模式而從中受益。比如gson okhttp retrift。如下 gson gson new gsonbuilder registertypeadapter string.class,new st...
四 JavaScript設計模式之建造者模式
一 建造者模式模式概念 建造者模式可以將乙個複雜的物件的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。也就是說如果我們用了建造者模式,那麼使用者就需要指定需要建造的型別就可以得到它們,而具體建造的過程和細節就不需要知道了。建造者模式實際就是乙個指揮者,乙個建造者,乙個使用指揮者呼叫具體建...
Android 建造者模式
在android第三庫使用過程中,比如alerdailog okhttp中,經常會用到builder,alertdialog.builder this settitle title setmessage message setnegativebutton 取消 setpositivebutton 確...