盤古開辟了天地,用身軀造出日月星辰、山川草木。那殘留在天地間的濁氣慢慢化作蟲魚鳥獸,為這寂靜的世界增添了生氣。這時,有一位女神女媧,在這莽莽的原野上行走。她放眼四望,山嶺起伏,江河奔流,叢林茂密,草木爭輝,天上百鳥飛鳴,地上群獸奔馳,水中魚兒嬉戲,草中蟲之豸跳躍,這世界按說也點綴得相當美麗了。但是她總覺得有一種說不出的寂寞,越看越煩,孤寂感越來越強烈,連自己也弄不清楚這是為什么。與山川草木訴說心中的煩躁,山川草木根本不懂她的話;對蟲魚鳥獸傾吐心事,蟲魚鳥獸哪能了解她的苦惱。
她頹然坐在一個池塘旁邊,茫然對池塘中自己的影子。忽然一片樹葉飄落池中,靜止的池水泛起了小小的漣漪,使她的影子也微微晃動起來。她突然覺得心頭的結解開了,是呀!為什么她會有那種說不出的孤寂感?原來是世界是缺少一種像她一樣的生物。想到這兒,她馬上用手在池邊挖了些泥土,和上水,照著自己的影子捏了起來。捏著捏著,捏成了一個小小的東西,模樣與女媧差不多,也有五官七竅,雙手兩腳。捏好后往地上一放,居然活了起來。女媧一見,滿心歡喜,接著又捏了許多。她把這些小東西叫作“人”。今天我們的大話設計就從女媧摶土造人的故事開始說起,女媧要建造一個人,那首先要造頭,身體,胳膊和腿,這就關乎到一個制造工序的問題,不知道讀者有沒有這樣的感覺,建造者模式和工程模式很接近,但是建造者模式提供了一個更加細粒度的對象的建造過程,我們先來看一下,建造者模式的結構圖:
? ? ? ??
依然以我們上述的女媧摶土造人為例,看看我們的代碼,首先,女媧要先創建一個需要建造的對象,如下:
~~~
//要構造的對象??
public?class?Robust???
{??
????String?head;??
????String?body;??
????????String?arm;??
????????String?leg;??
????public?String?getHead()???
????????{??
????????return?head;??
????}??
????public?void?setHead(String?head)???
????????{??
??
????????this.head?=?head;??
????}??
????public?String?getBody()??
????????{??
????????return?body;??
????}??
????public?void?setBody(String?body)??
????????{??
????????this.body?=?body;??
????}??
????????public?String?getArm()??
????????{??
????????return?arm;??
????}??
????public?void?setarm(String?arm)??
????????{??
????????this.arm?=?arm;??
????}??
????????public?String?getLeg()??
????????{??
????????return?leg;??
????}??
????public?void?setLeg(String?leg)??
????????{??
????????this.leg?=?leg;??
????}??
}??
~~~
然后有一個構造者的接口,其中包括了建造者會使用的建造過程
~~~
public?interface?Builder???
{??
??
????public?void?buidBody(String?body);??
????public?void?buidHead(String?head);??
????????public?void?buidArm(String?arm);??
????????public?void?buidLeg(String?leg);??
????public?Robust?getRobust();??
}??
public?class?RobustBuilder?implements?Builder???
{??
??
????Robust?robust?=?new?Robust();??
????????public?void?buidBody(String?body)???
????????{??
???????robust.setBody(body);??
????}??
??
????public?void?buidHead(String?head)??
????????{??
???????????robust.setHead(head);??
????}??
????????public?void?buidArm(String?arm)??
????????{??
???????????robust.setArm(arm);??
????}??
????????public?void?buidLeg(String?leg)??
????????{??
???????????robust.setLeg(leg);??
????}??
??
????????public?Robust?getRobust()???
????????{??
???????????return?robust;??
????}??
}??
~~~
有了建造者之后,需要有一個指揮家來指示建造的過程:
~~~
//指揮建造的類??
??
public?class?Director??
?{??
??
??????public?Robust?Construct(Builder?builder)??
??????{??
?????builder.buidBody(null);??
?????builder.buidHead(null);??
?????????builder.buidArm(null);??
?????????builder.buidLeg(null);??
?????return?builder.getRobust();??
???????}??
}??
~~~
這樣,女王摶土造人的過程就完成了,從代碼角度來說, 如果我們希望分離復雜類型構建規則和類型內部組成,或者希望把相同的構建過程用于構建不同類型的時候可以考慮使用建造者模式。從應用角度來說, 如果我們希望解耦產品的創建過程和產品的具體配件,或者我們希望為所有產品的創建復用一套穩定并且復雜的邏輯的時候可以考慮使用建造者模式。設計之旅,未完待續......