【通俗说设计模式】六、建造者模式 & Python示例

专业介绍:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

通俗介绍: 

开发过程中有时需要创建一个比较复杂的对象,这个复杂对象由多种子部件(属性/对象)组合而成,然后这些子部件还不止一种选择,在使用时根据需要选择不同的部件组合出这个复杂对象。

例如,创建一个计算机对象,其子部件由CPU/内存/硬盘/显卡/主板...多个部分组成,我们暂且简化场景,设定最终要用到的有两个计算机对象,一个是联想计算机,一个是戴尔计算机,它们内部的组成部件是相同的,只是具体部件档次不同。客户(使用者)只需要根据需要选择一类计算机 ,不需要亲自去组装(创建)这个计算机对象。

建造者模式的思想是将创建过程和组装过程分离,这其实提取出了不变的部分,即组装过程。这个需求其实由简单工厂模式和工厂方法模式,抽象工厂模式都可以实现;不同的是建造者模式针对的是组装过程,工厂模式针对的是创建过程,工厂模式创建中的产品的种类数量一般比较少,也不会很复杂;而建造者模式创建的产品是复杂的,由很多个部件组成,并强调不同的部件可组合成不同的结果。

建造者模式也包含了四种角色:

  • 产品角色(Product):是包含多个组成部件的复杂对象,有具体建造者来创建其各个部件。
  • 抽象建造者(Builder):是一个包含产品子部件的抽象方法的抽象类(接口),通常还包含一个返回生成对象的方法。
  • 具体建造者(ConcreteBuilder):实现Builder类(接口),完成复杂产品的各个部件的具体创建方法。
  • 指挥者(Director):调用建造者对象中的部件构造与装配方法完成复杂对象的创建。

代码:

# 建造者

import abc, six


# 产品角色(非抽象)
class Computer:
    # three part
    _cpu = ''
    _ram = ''
    _disk = ''

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

    @property
    def ram(self):
        return self._ram

    @property
    def disk(self):
        return self._disk

    def set_cpu(self, cpu):
        self._cpu = cpu

    def set_ram(self, ram):
        self._ram = ram

    def set_disk(self, disk):
        self._disk = disk

    def show(self):
        print(f'cpu:{self.cpu}\nram:{self.ram}\ndisk:{self.disk}')


# 抽象建造者(一种产品只有一个)
@six.add_metaclass(abc.ABCMeta)
class AbstractBuilder:
    @abc.abstractmethod
    def build_cpu(self): pass

    @abc.abstractmethod
    def build_ram(self): pass

    @abc.abstractmethod
    def build_disk(self): pass

    @abc.abstractmethod
    def get_computer(self) -> Computer: pass


# 具体建造者(可有多个)
class LenovoComputerBuilder(AbstractBuilder):
    def __init__(self):
        self._computer = Computer()

    def build_cpu(self):
        self._computer.set_cpu('lenovo i9-9900')

    def build_ram(self):
        self._computer.set_ram('lenovo DDR4 32GB')

    def build_disk(self):
        self._computer.set_disk('lenovo SSD 512GB')

    def get_computer(self):
        return self._computer


# 指挥者(一种产品只有一个指挥者)
class Director:
    _builder = None

    def set_builder(self, builder: AbstractBuilder):
        self._builder = builder

    def construct(self) -> Computer:
        self._builder.build_cpu()
        self._builder.build_ram()
        self._builder.build_disk()
        return self._builder.get_computer()


if __name__ == '__main__':
    director = Director()  # 创建指挥者
    director.set_builder(LenovoComputerBuilder())  # 指定一个具体建造者
    lenovo_computer = director.construct()  # 执行建造过程
    lenovo_computer.show()  # 查看建造的产品详细

    # 还可以再指定别的建造者,建造不同部件组成的computer
    # director.set_builder(OtherComputerBuilder)
    # xxx_computer = director.construct()
    # xxx_computer.show()

备注:关于abc, six库的基本用法参考文章 简单工厂模式 & Python示例 底部的介绍,: )

欢迎留言~

 

参考文章:

http://c.biancheng.net/view/1354.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值