建造者模式:將乙個複雜物件的構建與他的表示分離,使得同樣的構建過程可以建立不同的表示。
基本思想
某類產品的構建由很多複雜元件組成;
這些元件中的某些細節不同,構建出的產品表象會略有不同;
通過乙個指揮者按照產品的建立步驟來一步步執行產品的建立;
當需要建立不同的產品時,只需要派生乙個具體的建造者,重寫相應的元件構建方法即可。
**結構
class builder(object):
"""基類"""
def part1(self):
# 不同型別的產品,該步驟的細節可能不同
raise notimplementederror()
def part2(self):
# 不同型別的產品,該步驟的細節可能不同
raise notimplementederror()
class builder1(builder):
"""派生類,生產builder1型別的產品"""
def part1(self):
print 'builder1 part1'
def part2(self):
print 'builder1 part2'
class builder2(builder):
"""派生類,生產builder2型別的產品"""
def part1(self):
print 'builder2 part1'
def part2(self):
print 'builder2 part2'
class director(object):
"""指揮者,負責組織產品的構建過程"""
def build(self, builder):
builder.part1()
builder.part2()
def client():
director = director()
director.build(builder1())
director.build(builder2())
這裡有乙個疑問,指揮者這個角色有什麼用呢。感覺除了增加client的呼叫負擔外,似乎沒什麼用處。為什麼不把產品構建過程放在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()
沒錯,上面就是典型的模板方法模式的實現套路,回顧一下模板方法模式的定義: > 模板方法模式:定義乙個工作流或演算法的基本骨架,而將一些特定步驟的實現延遲到子類中。
模板方法模式更多的關注於演算法流程,而建造者模式更多的關注於複雜物件的建立,模板模式應用場景比建造者模式更多一些,寫起來也更自然一些。
類圖例項
#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 buiuhtbpstkldhead(self):
printinfo("構建%s的頭" % self.type)
def buildbody(self):
printinfo("構建%s的身體" % self.type)
def buildarm(self):
printi程式設計客棧nfo("構建%s的手" % self.type)
def buildleg(self):
printinfo("構建%s的腳" % self.type) 程式設計客棧
#瘦子
class personthinbuilder(personbuilder):
type = '瘦子'
def buildhead(self):
printinfo("構建%s的頭" % self.type)
def buildbody(self):
printinfo("構建%s的身體" % self.type)
def buildarm(self):
printinfo("構建%s的手" % self.type)
def buildleg(self):
printinfo("構建%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();
本文標題: 深入解析python設計模式程式設計中建造者模式的使用
本文位址: /jiaoben/python/143694.html
PHP設計模式之命令模式的深入解析
命令模式 command 命令模式是封裝乙個通用操作的機制。如果你熟悉c或php,你可能已經遇到過command,它相當於程式中的 callback 通常使用乙個函式指標或資料結構如php中的字串和陣列實現,command是在乙個方法呼叫之上的抽象,它吸收了所有物件導向的好處 合成 繼承和處理。例如...
結合案例深入解析模板方法設計模式
模板方法模式是類的行為模式。準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。例如 在現實生活中,完成某件事情是需要 n 個固定步驟的。如 ...
PHP設計模式之結構模式的深入解析
結構模式之間有許多相似之處,因為在物件模型結構中存在幾種關係 類之間的繼承和實現,加上物件組合,這些是php設計模式的主要目的。物件組合的最大優勢在於可以在執行時基於配置建立起乙個關係,並不用修改實際的 它是類繼承和介面實現需要的乙個操作。實際上,你完全可以通過修改物件之間而非類之間的鏈結定義乙個應...