先來(lái)復(fù)習(xí)一下設(shè)計(jì)模式的基本概念:
定義
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者隱藏了該產(chǎn)品是如何組裝的,所以若需要改變一個(gè)產(chǎn)品的內(nèi)部表示,只需要重新定一個(gè)建造者就可以了。
實(shí)用范圍
1.當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
2.當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同表示時(shí)。
角色
在這樣的設(shè)計(jì)模式中,有以下幾個(gè)角色:
1.builder:為創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定抽象接口。
2.ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,并 提供一個(gè)檢索產(chǎn)品的接口。
3.Director:構(gòu)造一個(gè)使用Builder接口的對(duì)象。
4.Product:表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
下面我們來(lái)看一個(gè)實(shí)例:
需求:
畫一個(gè)小人,有頭,有身體,兩手兩腳即可。
初始代碼:
# -*- encoding: utf-8 -*-#小人一puts '這是第一個(gè)小人'puts '小人一:頭'puts '小人一:瘦身體'puts '小人一:雙手'puts '小人一:雙腳'#小人二puts '這是第二個(gè)小人'puts '小人二:頭'puts '小人二:胖身體'puts '小人二:雙手'puts '小人二:雙腳'
問(wèn)題:代碼重復(fù),而且容易出錯(cuò),缺胳膊少腿之類的。
改進(jìn)代碼:
# -*- encoding: utf-8 -*-#class PersionBuilder def head puts '' end def body puts '' end def arm puts '' end def leg puts '' endend#小人一class PersionThinBuilder < PersionBuilder def head puts '頭' end def body puts '瘦身體' end def arm puts '雙手' end def leg puts '雙腳' endend#小人二class PersionFatBuilder < PersionBuilder def head puts '頭' end def body puts '胖身體' end def arm puts '雙手' end def leg puts '雙腳' endend#指揮者類class PersionDirect def initialize(persion) @persion = persion end def create_persion @persion.head @persion.body @persion.arm @persion.leg endendputs '這是第一個(gè)小人'p1 = PersionThinBuilder.newpd1 = PersionDirect.new(p1)pd1.create_persionputs '這是第二個(gè)小人'p2 = PersionThinBuilder.newpd2 = PersionDirect.new(p2)pd2.create_persion
新聞熱點(diǎn)
疑難解答
圖片精選