先來複習一下設計模式的基本概念:
定義
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
建造者隱藏了該產品是如何組裝的,所以若需要改變一個產品的內部表示,只需要重新定一個建造者就可以了。
實用範圍
1.當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2.當構造過程必須允許被構造的對象有不同表示時。
角色
在這樣的設計模式中,有以下幾個角色:
1.builder:為建立一個產品對象的各個組件指定抽象介面。
2.ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個組件,定義並明確它所建立的表示,並 提供一個檢索產品的介面。
3.Director:構造一個使用Builder介面的對象。
4.Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。
下面我們來看一個執行個體:
需求:
畫一個小人,有頭,有身體,兩手兩腳即可。
初始代碼:
# -*- encoding: utf-8 -*-#小人一puts '這是第一個小人'puts '小人一:頭'puts '小人一:瘦身體'puts '小人一:雙手'puts '小人一:雙腳'#小人二puts '這是第二個小人'puts '小人二:頭'puts '小人二:胖身體'puts '小人二:雙手'puts '小人二:雙腳'
問題:代碼重複,而且容易出錯,缺胳膊少腿之類的。
改進代碼:
# -*- 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 '這是第一個小人'p1 = PersionThinBuilder.newpd1 = PersionDirect.new(p1)pd1.create_persionputs '這是第二個小人'p2 = PersionThinBuilder.newpd2 = PersionDirect.new(p2)pd2.create_persion