深入解析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使用multiprocessing的詳細(xì)方法
multiprocessing是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,用于實(shí)現(xiàn)多進(jìn)程編程,它提供了一種簡(jiǎn)單而高效的方式來(lái)利用多核處理器的能力,通過(guò)在多個(gè)進(jìn)程中同時(shí)執(zhí)行任務(wù),加快程序的執(zhí)行速度和提高系統(tǒng)的吞吐量,這篇文章主要介紹了python使用multiprocessing,需要的朋友可以參考下2024-03-03
基于python元祖與字典與集合的粗淺認(rèn)識(shí)
下面小編就為大家?guī)?lái)一篇基于python元祖與字典與集合的粗淺認(rèn)識(shí)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù)
這篇文章主要為大家詳細(xì)介紹了python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Python socket實(shí)現(xiàn)簡(jiǎn)單聊天室
這篇文章主要為大家詳細(xì)介紹了Python socket實(shí)現(xiàn)簡(jiǎn)單聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Python實(shí)現(xiàn)采用進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的方法
這篇文章主要介紹了Python實(shí)現(xiàn)采用進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的方法,涉及Python數(shù)學(xué)運(yùn)算結(jié)合時(shí)間函數(shù)顯示進(jìn)度效果的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Python實(shí)現(xiàn)處理逆波蘭表達(dá)式示例
這篇文章主要介紹了Python實(shí)現(xiàn)處理逆波蘭表達(dá)式操作,結(jié)合實(shí)例形式分析了逆波蘭表達(dá)式的概念、原理及Python針對(duì)逆波蘭表達(dá)式的定義與計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
用于ETL的Python數(shù)據(jù)轉(zhuǎn)換工具詳解
這篇文章主要介紹了用于ETL的Python數(shù)據(jù)轉(zhuǎn)換工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
python中計(jì)算一個(gè)列表中連續(xù)相同的元素個(gè)數(shù)方法
今天小編就為大家分享一篇python中計(jì)算一個(gè)列表中連續(xù)相同的元素個(gè)數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
使用Python中的pytesseract模塊實(shí)現(xiàn)抓取圖片中文字
最近同事用網(wǎng)上提供掃描軟件進(jìn)行掃描識(shí)別文字,每天上線只能夠做兩次掃描,請(qǐng)求我研發(fā)一個(gè)小工具幫助解決識(shí)別圖片的中文字,最終我選擇使用pytesseract模塊可以解決這個(gè)需求問(wèn)題,本文給大家分享實(shí)現(xiàn)代碼操作感興趣的朋友跟隨小編一起看看吧2022-11-11

