国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

深入解析Python設(shè)計(jì)模式編程中建造者模式的使用

2020-01-04 17:40:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了深入解析Python設(shè)計(jì)模式編程中建造者模式的使用,建造者模式的程序通常將所有細(xì)節(jié)都交由子類(lèi)實(shí)現(xiàn),需要的朋友可以參考下
 

建造者模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與他的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

基本思想
某類(lèi)產(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è)具體的建造者,重寫(xiě)相應(yīng)的組件構(gòu)建方法即可。

代碼結(jié)構(gòu)

class Builder(object):  """基類(lèi)"""  def Part1(self):    # 不同類(lèi)型的產(chǎn)品,該步驟的細(xì)節(jié)可能不同    raise NotImplementedError()  def Part2(self):    # 不同類(lèi)型的產(chǎn)品,該步驟的細(xì)節(jié)可能不同    raise NotImplementedError()class Builder1(Builder):  """派生類(lèi),生產(chǎn)builder1類(lèi)型的產(chǎn)品"""  def Part1(self):    print 'builder1 Part1'  def Part2(self):    print 'builder1 Part2'class Builder2(Builder):  """派生類(lèi),生產(chǎn)builder2類(lèi)型的產(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基類(lèi)中呢,像下面這樣:

class Builder(object):  """基類(lèi)"""  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)延遲到子類(lèi)中。

模板方法模式更多的關(guān)注于算法流程,而建造者模式更多的關(guān)注于復(fù)雜對(duì)象的創(chuàng)建,模板模式應(yīng)用場(chǎng)景比建造者模式更多一些,寫(xiě)起來(lái)也更自然一些。

類(lèi)圖

深入解析Python設(shè)計(jì)模式編程中建造者模式的使用

 

實(shí)例

#encoding=utf-8 # #by panda #建造者模式   def printInfo(info):   print unicode(info, 'utf-8').encode('gbk')  #建造者基類(lèi) 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();

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 祥云县| 景泰县| 大宁县| 北票市| 嘉义县| 龙江县| 友谊县| 元阳县| 承德县| 西吉县| 惠安县| 平江县| 谢通门县| 田林县| 泽普县| 科尔| 井研县| 晋江市| 米脂县| 新巴尔虎右旗| 龙游县| 龙海市| 靖远县| 石景山区| 漳平市| 疏勒县| 滨州市| 股票| 福州市| 富锦市| 宝坻区| 文昌市| 寿宁县| 巴林右旗| 沙坪坝区| 陆川县| 丰台区| 曲水县| 共和县| 无为县| 铜鼓县|