Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例
先來(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ò)程,包含定義組成部件的類(lèi),包括將這些部件裝配成最終產(chǎn)品的接口。
下面我們來(lái)看一個(gè)實(shí)例:
需求:
畫(huà)一個(gè)小人,有頭,有身體,兩手兩腳即可。
初始代碼:
# -*- encoding: utf-8 -*- #小人一 puts '這是第一個(gè)小人' puts '小人一:頭' puts '小人一:瘦身體' puts '小人一:雙手' puts '小人一:雙腳' #小人二 puts '這是第二個(gè)小人' puts '小人二:頭' puts '小人二:胖身體' puts '小人二:雙手' puts '小人二:雙腳'
問(wèn)題:代碼重復(fù),而且容易出錯(cuò),缺胳膊少腿之類(lèi)的。
改進(jìn)代碼:
# -*- encoding: utf-8 -*- # class PersionBuilder def head puts '' end def body puts '' end def arm puts '' end def leg puts '' end end #小人一 class PersionThinBuilder < PersionBuilder def head puts '頭' end def body puts '瘦身體' end def arm puts '雙手' end def leg puts '雙腳' end end #小人二 class PersionFatBuilder < PersionBuilder def head puts '頭' end def body puts '胖身體' end def arm puts '雙手' end def leg puts '雙腳' end end #指揮者類(lèi) class PersionDirect def initialize(persion) @persion = persion end def create_persion @persion.head @persion.body @persion.arm @persion.leg end end puts '這是第一個(gè)小人' p1 = PersionThinBuilder.new pd1 = PersionDirect.new(p1) pd1.create_persion puts '這是第二個(gè)小人' p2 = PersionThinBuilder.new pd2 = PersionDirect.new(p2) pd2.create_persion
- 設(shè)計(jì)模式中的觀察者模式在Ruby編程中的運(yùn)用實(shí)例解析
- 實(shí)例解析Ruby設(shè)計(jì)模式開(kāi)發(fā)中對(duì)觀察者模式的實(shí)現(xiàn)
- 深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用
- Ruby設(shè)計(jì)模式編程中對(duì)外觀模式的應(yīng)用實(shí)例分析
- 詳解組合模式的結(jié)構(gòu)及其在Ruby設(shè)計(jì)模式編程中的運(yùn)用
- 設(shè)計(jì)模式中的模板方法模式在Ruby中的應(yīng)用實(shí)例兩則
- 實(shí)例解析Ruby設(shè)計(jì)模式編程中Strategy策略模式的使用
- 實(shí)例講解Ruby使用設(shè)計(jì)模式中的裝飾器模式的方法
- 詳解Ruby設(shè)計(jì)模式編程中對(duì)單例模式的運(yùn)用
- Ruby設(shè)計(jì)模式編程之適配器模式實(shí)戰(zhàn)攻略
- Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例
- Ruby中使用設(shè)計(jì)模式中的簡(jiǎn)單工廠模式和工廠方法模式
- 解析proxy代理模式在Ruby設(shè)計(jì)模式開(kāi)發(fā)中的運(yùn)用
相關(guān)文章
ruby迭代map的簡(jiǎn)潔寫(xiě)法實(shí)現(xiàn)原理分析
這篇文章主要介紹了ruby迭代map的簡(jiǎn)潔寫(xiě)法實(shí)現(xiàn)原理分析,本文著重對(duì)簡(jiǎn)潔寫(xiě)法的原理進(jìn)行解析,需要的朋友可以參考下2014-11-11Ruby學(xué)習(xí)筆記二幫助生成Vim添加代碼頭的代碼
這篇文章主要介紹了Ruby幫助生成Vim添加代碼頭的代碼,需要的朋友可以參考下2014-07-07Ruby中的類(lèi)Google Map/Reduce框架Skynet介紹
這篇文章主要介紹了Ruby中的類(lèi)Google Map/Reduce框架Skynet介紹,Skynet是一款創(chuàng)建分布式應(yīng)用程序的框架,需要的朋友可以參考下2015-01-01Ruby使用REXML庫(kù)來(lái)解析xml格式數(shù)據(jù)的方法
這篇文章主要介紹了Ruby使用REXML庫(kù)來(lái)解析xml格式數(shù)據(jù)的方法,文章最后提及了REXML庫(kù)的使用相關(guān)安全問(wèn)題可以注意一下,需要的朋友可以參考下2016-04-04Ruby中使用設(shè)計(jì)模式中的簡(jiǎn)單工廠模式和工廠方法模式
這篇文章主要介紹了Ruby中使用設(shè)計(jì)模式中的簡(jiǎn)單工廠模式和工廠方法模式的示例,這兩種模式經(jīng)常被用于Ruby on Rails開(kāi)發(fā)的結(jié)構(gòu)設(shè)計(jì)中,需要的朋友可以參考下2016-03-03實(shí)例講解Ruby中的鉤子方法及對(duì)方法調(diào)用添加鉤子
鉤子方法即是在普通的方法上添加"鉤子",使特定事件發(fā)生時(shí)可以被調(diào)用,下面就來(lái)以實(shí)例講解Ruby中的鉤子方法及對(duì)方法調(diào)用添加鉤子2016-06-06Ruby簡(jiǎn)潔學(xué)習(xí)筆記(二):類(lèi)繼承、屬性、類(lèi)變量
這篇文章主要介紹了Ruby簡(jiǎn)潔學(xué)習(xí)筆記(二):類(lèi)繼承、屬性、類(lèi)變量,本文是個(gè)人學(xué)習(xí)總結(jié)第二篇,需要的朋友可以參考下2015-01-01