视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
深入解析Python设计模式编程中建造者模式的使用
2020-11-27 14:35:36 责编:小采
文档
 建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

基本思想
某类产品的构建由很多复杂组件组成;
这些组件中的某些细节不同,构建出的产品表象会略有不同;
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。

代码结构

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

下载本文
显示全文
专题