深入解析Python設(shè)計(jì)模式編程中建造者模式的使用
建造者模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與他的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
基本思想
某類產(chǎn)品的構(gòu)建由很多復(fù)雜組件組成;
這些組件中的某些細(xì)節(jié)不同,構(gòu)建出的產(chǎn)品表象會(huì)略有不同;
通過(guò)一個(gè)指揮者按照產(chǎn)品的創(chuàng)建步驟來(lái)一步步執(zhí)行產(chǎn)品的創(chuàng)建;
當(dāng)需要?jiǎng)?chuàng)建不同的產(chǎn)品時(shí),只需要派生一個(gè)具體的建造者,重寫相應(yīng)的組件構(gòu)建方法即可。
代碼結(jié)構(gòu)
class Builder(object): """基類""" def Part1(self): # 不同類型的產(chǎn)品,該步驟的細(xì)節(jié)可能不同 raise NotImplementedError() def Part2(self): # 不同類型的產(chǎn)品,該步驟的細(xì)節(jié)可能不同 raise NotImplementedError() class Builder1(Builder): """派生類,生產(chǎn)builder1類型的產(chǎn)品""" def Part1(self): print 'builder1 Part1' def Part2(self): print 'builder1 Part2' class Builder2(Builder): """派生類,生產(chǎn)builder2類型的產(chǎn)品""" def Part1(self): print 'builder2 Part1' def Part2(self): print 'builder2 Part2' class Director(object): """指揮者,負(fù)責(zé)組織產(chǎn)品的構(gòu)建過(guò)程""" def Build(self, builder): builder.Part1() builder.Part2() def client(): director = Director() director.Build(Builder1()) director.Build(Builder2())
這里有一個(gè)疑問(wèn),指揮者這個(gè)角色有什么用呢。感覺(jué)除了增加client的調(diào)用負(fù)擔(dān)外,似乎沒(méi)什么用處。為什么不把產(chǎn)品構(gòu)建過(guò)程放在Builder基類中呢,像下面這樣:
class Builder(object): """基類""" def Part1(self): raise NotImplementedError() def Part2(self): raise NotImplementedError() def Build(self): self.Part1() self.Part2() class Builder1(Builder): def Part1(self): print 'builder1 Part1' def Part2(self): print 'builder1 Part2' class Builder2(Builder): def Part1(self): print 'builder2 Part1' def Part2(self): print 'builder2 Part2' def client(): Builder1().Build() Builder2().Build()
沒(méi)錯(cuò),上面就是典型的模板方法模式的實(shí)現(xiàn)套路,回顧一下模板方法模式的定義: > 模板方法模式:定義一個(gè)工作流或算法的基本骨架,而將一些特定步驟的實(shí)現(xiàn)延遲到子類中。
模板方法模式更多的關(guān)注于算法流程,而建造者模式更多的關(guān)注于復(fù)雜對(duì)象的創(chuàng)建,模板模式應(yīng)用場(chǎng)景比建造者模式更多一些,寫起來(lái)也更自然一些。
類圖
實(shí)例
#encoding=utf-8 # #by panda #建造者模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #建造者基類 class PersonBuilder(): def BuildHead(self): pass def BuildBody(self): pass def BuildArm(self): pass def BuildLeg(self): pass #胖子 class PersonFatBuilder(PersonBuilder): type = '胖子' def BuildHead(self): printInfo("構(gòu)建%s的頭" % self.type) def BuildBody(self): printInfo("構(gòu)建%s的身體" % self.type) def BuildArm(self): printInfo("構(gòu)建%s的手" % self.type) def BuildLeg(self): printInfo("構(gòu)建%s的腳" % self.type) #瘦子 class PersonThinBuilder(PersonBuilder): type = '瘦子' def BuildHead(self): printInfo("構(gòu)建%s的頭" % self.type) def BuildBody(self): printInfo("構(gòu)建%s的身體" % self.type) def BuildArm(self): printInfo("構(gòu)建%s的手" % self.type) def BuildLeg(self): printInfo("構(gòu)建%s的腳" % self.type) #指揮者 class PersonDirector(): pb = None; def __init__(self, pb): self.pb = pb def CreatePereson(self): self.pb.BuildHead() self.pb.BuildBody() self.pb.BuildArm() self.pb.BuildLeg() def clientUI(): pb = PersonThinBuilder() pd = PersonDirector(pb) pd.CreatePereson() pb = PersonFatBuilder() pd = PersonDirector(pb) pd.CreatePereson() return if __name__ == '__main__': clientUI();
相關(guān)文章
用python實(shí)現(xiàn)刷點(diǎn)擊率的示例代碼
今天小編就為大家分享一篇用python實(shí)現(xiàn)刷點(diǎn)擊率的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02網(wǎng)易2016研發(fā)工程師編程題 獎(jiǎng)學(xué)金(python)
這篇文章主要為大家詳細(xì)介紹了網(wǎng)易2016研發(fā)工程師編程題:獎(jiǎng)學(xué)金(python),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06基于python實(shí)現(xiàn)計(jì)算且附帶進(jìn)度條代碼實(shí)例
這篇文章主要介紹了基于python實(shí)現(xiàn)計(jì)算且附帶進(jìn)度條代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Python之兩種模式的生產(chǎn)者消費(fèi)者模型詳解
今天小編就為大家分享一篇Python之兩種模式的生產(chǎn)者消費(fèi)者模型詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Pytorch模型遷移和遷移學(xué)習(xí),導(dǎo)入部分模型參數(shù)的操作
這篇文章主要介紹了Pytorch模型遷移和遷移學(xué)習(xí),導(dǎo)入部分模型參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Pandas對(duì)數(shù)值進(jìn)行分箱操作的4種方法總結(jié)
分箱是一種常見(jiàn)的數(shù)據(jù)預(yù)處理技術(shù)有時(shí)也被稱為分桶或離散化,他可用于將連續(xù)數(shù)據(jù)的間隔分組到“箱”或“桶”中。本文將使用python?Pandas庫(kù)對(duì)數(shù)值進(jìn)行分箱的4種方法,感興趣的可以了解一下2022-05-05Django自帶用戶認(rèn)證系統(tǒng)使用方法解析
這篇文章主要介紹了Django自帶用戶認(rèn)證系統(tǒng)使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11python opencv實(shí)現(xiàn)圖像矯正功能
這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)圖像矯正功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08