建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
基本思想
某类产品的构建由很多复杂组件组成;
这些组件中的某些细节不同,构建出的产品表象会略有不同;
通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。
代码结构
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();