zoukankan      html  css  js  c++  java
  • 创建型模式---建造者模式

    建造者模式

    我们想要创建一个由多个部分构成的对象,而且它的构成需要一步一步地完成。只有当各个部分都创建好,这个对象才算是完整的。这正是建造者设计模式的用武之地。
    建造者模式将一个复杂对象的构造过程与其表现分离,这样同一个构造过程可用于创建不同的表现。 现实生活中的例子:快餐店使用的就是建造者模式。即使存在不同的多种汉堡包和包装,准备一个汉堡包及打包的过程是相同的。经典款汉堡包和奶酪汉堡包之间的区别在于表现,而不是建造过程。
    指挥者是出纳员,将需要准备什么餐品的指令传达给工作人员,建造者是工作人员中的个体,关注具体顺序。
    应用案例:建造者模式和工厂模式的主要区别在于工厂模式以单个步骤创建对象,而建造者模式以多个步骤创建对象,并且几乎始终会使用一个指挥者。
    另一个区别是,在工厂模式下,会立即返回一个创建好的对象;而在建造者模式下,仅在需要时客户端代码才显示地请求指挥者返回最终的对象。
    #假设想买一台新电脑,如果决定购置一台也定的预配置的电脑型号,如苹果1.4GHz Mac mini,则是使用工厂模式。
    # 所有的规格都已经由制造商预先确定,制造商不用向你咨询什么就知道自己该做什么,他们通常接收仅仅是单条指令。
    
    #工厂模式
    MINI14 = '1.4GHz Mac mini'
    class AppleFactory:
        class MacMini14:
            def __init__(self):
                self.memory = 4
                self.hdd = 500
                self.gpu = 'Intel HD Graphics 5000'
    
            def __str__(self):
                info = ("Model:{}".format(MINI14),
                        "Memory:{}GB".format(self.memory),
                        "Hard Disk:{}GB".format(self.hdd),
                        "Graphics Card:{}".format(self.gpu))
                return '
    '.join(info)
    
        def build_computer(self,model):
            if model==MINI14:
                return self.MacMini14()
            else:
                print("I don't know how to build {}.".format(model))
    
    # if __name__ == '__main__':
    #     afac = AppleFactory()
    #     mac_mini = afac.build_computer(MINI14)
    #     print(mac_mini)
    
    #创建者模式,购买提条定制的电脑,假若这样使用的则是建造者模式。你是指挥者,向制造商提供指令说明心中理想的电脑规格。
    class Computer:
        def __init__(self,serial_number):
            self.serial = serial_number
            self.memory = None
            self.hdd = None
            self.gpu = None
    
        def __str__(self):
            info = ("Model:{}".format(MINI14),
                    "Memory:{}GB".format(self.memory),
                    "Hard Disk:{}GB".format(self.hdd),
                    "Graphics Card:{}".format(self.gpu))
            return '
    '.join(info)
    
    class ComputerBuilder:
        def __init__(self):
            self.computer = Computer('AG23385193')
    
        def configure_memory(self,amount):
            self.computer.memory = amount
    
        def configure_hdd(self,amount):
            self.computer.hdd = amount
    
        def configure_gpu(self,gpu_model):
            self.computer.gpu = gpu_model
    
    class HardwareEngineer:
        def __init__(self):
            self.builder = None
    
        def construct_computer(self,memory,hdd,gpu):
            self.builder = ComputerBuilder()
            # [step for step in (self.builder.configure_memory(memory),
            #                    self.builder.configure_hdd(hdd),
            #                    self.builder.configure_gpu(gpu))]
            self.builder.configure_memory(memory)
            self.builder.configure_hdd(hdd)
            self.builder.configure_gpu(gpu)
    
        @property
        def computer(self):
            return self.builder.computer
    
    def main():
        engineer = HardwareEngineer()
        engineer.construct_computer(hdd=500,memory=8,gpu='GeForce GTX 650 Ti')
        computer = engineer.computer
        print(computer)
    
    if __name__ == '__main__':
        main()

    小结

    在以下情况下,与工厂模式相比,建造者模式是更好的选择。
        1.想要创建一个复杂对象(对象由多个部分构成,且对象的创建要经过多个不同的步骤,这些步骤也许还需遵从特定的顺序);
        2.要求一个对象能有不同的表现,并希望将对象的构造与表现解耦;
        3.想要在某个时间点创建对象,但在稍后的时间点再访问。
    做一枚奔跑的老少年!
  • 相关阅读:
    矩阵树定理(Kirchhoff || Laplace)初探——Part 1(无向图计数)
    AC自动机——看似KMP在跑,其实fail在跳
    逆序数模板
    牛客暑期五几何题
    priority_queue()大根堆和小根堆(二叉堆)
    STL中去重函数unique
    简单判断long long 以内的回文数
    素数判断和素数筛(简单方便)
    记忆化递归
    map详细的复习
  • 原文地址:https://www.cnblogs.com/xiaoshayu520ly/p/10981399.html
Copyright © 2011-2022 走看看