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

首頁 > 編程 > Python > 正文

深入解析Python設計模式編程中建造者模式的使用

2019-11-25 16:54:23
字體:
來源:轉載
供稿:網友

建造者模式:將一個復雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。

基本思想
某類產品的構建由很多復雜組件組成;
這些組件中的某些細節不同,構建出的產品表象會略有不同;
通過一個指揮者按照產品的創建步驟來一步步執行產品的創建;
當需要創建不同的產品時,只需要派生一個具體的建造者,重寫相應的組件構建方法即可。

代碼結構

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()

沒錯,上面就是典型的模板方法模式的實現套路,回顧一下模板方法模式的定義: > 模板方法模式:定義一個工作流或算法的基本骨架,而將一些特定步驟的實現延遲到子類中。

模板方法模式更多的關注于算法流程,而建造者模式更多的關注于復雜對象的創建,模板模式應用場景比建造者模式更多一些,寫起來也更自然一些。

類圖

201632105858217.gif (622×286)

實例

#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("構建%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 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(); 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南陵县| 班玛县| 满城县| 神池县| 绍兴县| 根河市| 卢龙县| 江陵县| 鄂尔多斯市| 壤塘县| 江阴市| 秦安县| 溧水县| 宜黄县| 丹江口市| 青神县| 喀什市| 台东县| 兴安盟| 澄城县| 安化县| 瑞昌市| 伊吾县| 上杭县| 郴州市| 马山县| 西乡县| 仁布县| 五常市| 玉溪市| 沽源县| 庄河市| 长治市| 博野县| 渭源县| 安仁县| 南宁市| 永靖县| 新竹市| 新巴尔虎右旗| 河池市|