网络编程
位置:首页>> 网络编程>> Python编程>> 深入解析Python设计模式编程中建造者模式的使用

深入解析Python设计模式编程中建造者模式的使用

作者:Blue Wish  发布时间:2021-03-10 15:32:18 

标签:Python,设计模式

建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

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

代码结构


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

没错,上面就是典型的模板方法模式的实现套路,回顾一下模板方法模式的定义: > 模板方法模式:定义一个工作流或算法的基本骨架,而将一些特定步骤的实现延迟到子类中。

模板方法模式更多的关注于算法流程,而建造者模式更多的关注于复杂对象的创建,模板模式应用场景比建造者模式更多一些,写起来也更自然一些。

类图

深入解析Python设计模式编程中建造者模式的使用

实例


#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();
0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com