欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年03月02日 10:59:08   作者:Blue Wish  
這篇文章主要介紹了深入解析Python設(shè)計(jì)模式編程中建造者模式的使用,建造者模式的程序通常將所有細(xì)節(jié)都交由子類實(shí)現(xiàn),需要的朋友可以參考下

建造者模式:將一個(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)也更自然一些。

類圖

201632105858217.gif (622×286)

實(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)文章

最新評(píng)論