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

1220次阅读  |  发布于5年以前

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

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

代码结构


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

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8