• python设计模式


        def __delattr__(self, name):
            """ Remove non-slot field attribute. """
            try:
                del self._attrs[name]
            except KeyError:
                raise AttributeError(name)
    
        def __str__(self):
            return "%s.%s" % (self.model_name, self.name)
    
        def __repr__(self):
            return "%s.%s" % (self.model_name, self.name)

    一、 建造者模式

    想要创建一个由多个部分构成的对象,而且他的构成需要一步接一步地完成。只有当各个部分都创建好,这个对象才是完整的。这时就需要建造者模式

    建造者设计模式:将一个复杂对象的构造过程与其表现分离,构造过程可用于创建多个不同的表现。

    该模式中有两个参与者:建造者指挥者

    建造者负责创建复杂对象的各个组成部分。

    指挥者使用建造者实例控制建造的过程。

    1.工厂模式以单个步骤创建对象,而建造者模式以多个步骤创建独享,并且几乎始终使用同一个指挥者;

    2.在工厂模式下,会立即返回一个创建好的对象;而在建造者模式下,仅在需要时客户端代码才显示地请求指挥者返回最终的对象。

    1. 建造者模式的苹果电脑应用案例

    类里面套一个类,这种写法可以禁止直接实例化一个类的简洁方式

    一个苹果电脑的例子,制造商将所有的硬件规格都隐藏了起来,客户只知道去买某个品牌和型号的笔记本

    可以看到只有AppleFactory类实例化, 但生产的其他参数都隐藏了起来,无法直接实例化生产过程MacMini14
    过程的参数,让购买者无需关心内部生产的过程

    # 设计模式
    MINI14 = '1.4GHZ MAC MINI'
    
    
    class AppleFactory:
    
        class MacMini14:
    
            def __init__(self):
                self.menory = 8
                self.hdd = 500
                self.gpu = 'Inter HD Graphics 5000'
    
            def __str__(self):
                info = (
                    'Model:{}'.format(MINI14),
                    'Memory:{}'.format(self.menory),
                    'Hard Disk:{}'.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 dont know how to build {}".format(model))
                
    if __name__=='__main__':
       afac=AppleFactory()
       mac_mini=afac.build_computer(MINI14)
       print (mac_mini)

    工厂模式和建造者模式的区别

    1. 工厂模式以单个步骤创建对象,创建者模式以多个步骤创建对象,并且几乎始终会使用一个指挥者。
    2. 在工厂模式下,会立即返回一个创建好的对象;而在建造者模式下,仅在需要时客户端代码才显示地请求指挥者返回最终的对象

    2. 案例二:作为指挥者向制造商提供指令,制作想要的电脑

    首先实例化HardwareEngineer,调用并传参construct_computer(self, memory, hdd, gpu),再去实例化ComputerBuilder()--> Computer()

    列表式执行函数

            [step for step in (self.builder.configure_momory(memory),
                               self.builder.configure_hdd(hdd),
                               self.builder.configure_gpu(gpu))]

    class Computer:
    
        def __init__(self, serial_number):
            self.serial = serial_number
            self.memory = None  # 单位为GB
            self.hdd = None     # 单位为GB
            self.gpu = None
    
        def __str__(self):
            info = ('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_momory(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_momory(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__':
        '''
        通过HardwareEngineer(传参调用ComputerBuilder,可以使用其他类也可以) --> ComputerBuilder --> Computer(负责打印输出数据)
        '''
        main()
    # 设计模式
    MINI14 = '1.4GHZ MAC MINI'


    class AppleFactory:

    class MacMini14:

    def __init__(self):
    self.menory = 8
    self.hdd = 500
    self.gpu = 'Inter HD Graphics 5000'

    def __str__(self):
    info = (
    'Model:{}'.format(MINI14),
    'Memory:{}'.format(self.menory),
    'Hard Disk:{}'.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 dont know how to build {}".format(model))

    if __name__=='__main__':
    afac=AppleFactory()
    mac_mini=afac.build_computer(MINI14)
    print (mac_mini)
  • 相关阅读:
    Day-10: 错误、调试和测试
    Day-9: 面对对象高级编程
    json文件解析
    sqlite3入门之sqlite3_get_table,sqlite3_free_table
    sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close
    字符集编码与字符大小
    让ubuntu下的eclipse支持GBK编码
    使用virtualbox安装unbuntu开启共享文件夹时遇到的权限问题
    QT--信号与槽
    QT--初识
  • 原文地址:https://www.cnblogs.com/1314520xh/p/12169041.html
Copyright © 2020-2023  润新知