ITPub博客

首页 > 数据库 > 数据库开发技术 > python 面向对象设计模式实践篇(5)-创建型:建造者模式实践

python 面向对象设计模式实践篇(5)-创建型:建造者模式实践

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-24 17:29:00 0 删除 编辑

建造者模式


所属分类

  • 创建型模式

意图

  • 把一个复杂对象构建和它的表示分离。
  • 一个对象如果涉及多个组成部分的对象,且这个对象的构成需要按一定顺序组合完成的时候适用

和抽象工厂的区别

  • 是在抽象工模式进一步扩展演化,可以创建更复杂的对象。
  • 抽象工厂偏向于单个多个系列的产品对象。
  • 建造者偏向于构造复杂的一个对象

角色对象:

  • 抽象建造者(Builder):用于规范产品类各个组成的部分,并提供一个返回完整产品方法。

  • 具体建造者(Concrete Builder):实现抽象建造者规定的各个方法,返回一个组建完毕的具体产品。

  • 产品(Product):建造者最终需要创建复杂成品类型。

  • 导演者(Director):规范建造者(Builder)制作出产品过程中的行为顺序,并将最终成品输出给客户。

实现

#!/usr/bin/evn python
# coding=utf-8

from abc import ABCMeta, abstractmethod


# 具体的产品类
class Computer():

    @property
    def cpu(self):
        return self.__cpu__

    @cpu.setter
    def cpu(self, value):
        self.__cpu__ = value

    @property
    def power(self):
        return self.__power__

    @power.setter
    def power(self, value):
        self.__power__ = value

    @property
    def graphics_card(self):
        return self.__graphics_card__

    @graphics_card.setter
    def graphics_card(self, value):
        self.__graphics_card__ = value

    @property
    def make_memory_module(self):
        return self.__make_memory_module__

    @make_memory_module.setter
    def make_memory_module(self, value):
        self.__make_memory_module__ = value


# 抽象建造者(Builder)-计算机抽象类
class ComputerBuilder(metaclass=ABCMeta):

    # 抽象Builder的角色---制作CPU的对象角色
    @abstractmethod
    def make_cpu(self):
        pass

    # 抽象Builder的角色---制作电源的对象角色
    @abstractmethod
    def make_power(self):
        pass

    # 抽象Builder的角色---制作显卡的对象角色
    @abstractmethod
    def make_graphics_card(self):
        pass

    # 抽象Builder的角色---制作内存条的对象角色
    @abstractmethod
    def make_memory_module(self):
        pass

    # 组合所有的模块返回成品
    @abstractmethod
    def construct_module(self):
        pass


class HuaweiComputer(ComputerBuilder):
    '''
    抽象建造者(Builder) 实现类--华为电脑
    '
''

    def __init__(self):
        self.name = '华为电脑'
        self.computer = Computer()

    def make_cpu(self):
        self.computer.cpu = '返回CPU对象'
        return self.computer.cpu

    def make_power(self):
        self.computer.power = '返回电源对象'
        return self.computer.power

    def make_graphics_card(self):
        self.computer.graphics_card = '返回显卡对象'
        return self.computer.graphics_card

    def make_memory_module(self):
        self.computer.make_memory_module = '返回内存条对象'
        return self.computer.make_memory_module

    def construct_module(self):

        return self.name+"-组装所有的模块"+self.__str__()

class XiaomiComputer(ComputerBuilder):
    '''
    抽象建造者(Builder) 实现类--小米电脑
    '
''

    def __init__(self):
        self.name = '小米电脑'
        self.computer = Computer()

    def make_cpu(self):
        self.computer.cpu = '返回CPU对象'
        return self.computer.cpu

    def make_power(self):
        self.computer.power = '返回电源对象'
        return self.computer.power

    def make_graphics_card(self):
        self.computer.graphics_card = '返回显卡对象'
        return self.computer.graphics_card

    def make_memory_module(self):
        self.computer.make_memory_module = '返回内存条对象'
        return self.computer.make_memory_module

    def construct_module(self):

        return self.name+"-组装所有的模块"+self.__str__()


class ComputerDirector():
        '''
        指挥组合创建具体的成品
       '
''

        def __init__(self,computer_builder):
            self.computer_builder = computer_builder

        def construct(self):
            # 第1步给CPU
            self.computer_builder.make_cpu()
            # 第2步给电源
            self.computer_builder.make_power()
            # 第3步显卡
            self.computer_builder.make_graphics_card()
            # 第4步内存条
            self.computer_builder.make_memory_module()

            return self.computer_builder.construct_module()


if __name__ == '__main__':


    print(ComputerDirector(HuaweiComputer()).construct())
    print(ComputerDirector(XiaomiComputer()).construct())

优点:

  • 隐藏一个复杂的产品内部的结构和组装过程
  • 控制装配构建过程细节
  • 把构造代码和表示代码分开

缺点:

  • 新的复杂对象的构建,需重复的创建对应的产品和抽象类的实现。

个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111698