专业介绍:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
通俗介绍:
开发过程中有时需要创建一个比较复杂的对象,这个复杂对象由多种子部件(属性/对象)组合而成,然后这些子部件还不止一种选择,在使用时根据需要选择不同的部件组合出这个复杂对象。
例如,创建一个计算机对象,其子部件由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示例 底部的介绍,: )
欢迎留言~
参考文章: