• 创建者模式


    意图:
    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
     
    适用性:
    当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    当构造过程必须允许被构造的对象有不同的表示时。
     
    示例代码:
    #-*- coding:utf-8 -*-
    '''
    Builder
    '''
    #建造者模式 
    #相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现。
    # 建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
    # 基本思想
    # 某类产品的构建由很多复杂组件组成;
    # 这些组件中的某些细节不同,构建出的产品表象会略有不同;
    # 通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
    # 当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。
     
    def printInfo(info):
        print(info)
     
    #建造者基类
    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()
     
        pb2 = PersonFatBuilder()
        #pd = PersonDirector(pb)
        pd.pb = pb2
        pd.CreatePereson()
        return
    
    if __name__ == '__main__':
        clientUI();
    执行结果:
    personBuilder(父类 or 基类)
    PersonFatBuilder(personBuilder的子类 or派生类):作用为创建一个胖子的身体部位
    PersonThinBuilder(personBuilder的子类 or派生类):作用为创建一个瘦子的身体部位
    PersonDirector(新式类):作用为根据personBuilder子类对象(如PersonFatBuilder())让其创建其身体部位
     

  • 相关阅读:
    和为S的连续正数序列
    数组中的逆序对
    剑指offer:数组中出现次数超过一半的数字
    剑指offer12:矩阵中的路径
    剑指offer(62):孩子们的游戏(圆圈中最后剩下的数)约瑟夫环问题
    剑指offer41:数据流中的中位数
    剑指offer56:数组中只出现一次的数字
    不用加减乘除做加法
    输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可
    求树的高度
  • 原文地址:https://www.cnblogs.com/absoluteli/p/14123973.html
Copyright © 2020-2023  润新知