當欲创建一个由多个部分組成的对象,而且它的构成需要依序完成,此時使用建造者(Builder)模式正是最佳的解決方案,利用此模式可将一个复杂对象的构造过程与其表现完全分离,且同一个构造过程可以产生多个不同的表现,这种需求存在于许多应用開發中,如HTML页面生成器、文档转换器以及UI表单创建工具等場合。
示例:以建造者模式定制电脑各部份之構建過程
class Computer: #產品類
def __init__(self, serial_number):
self.serial = serial_number
self.memory = None
self.hdd = None
self.gpu = None
def __str__(self):
info = ('Memory: {}GB'.format(self.memory), 'Hard Disk: {}GB'.format(self.hdd), 'Graphics Card: {}'.format(self.gpu))
return '\n'.join(info)
class ComputerBuilder: #此是建造者(Builder)
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 ComputerHardware: #此是指挥者(Director)
def __init__(self):
self.builder = None
def construct_computer(self, memory, hdd, gpu):
self.builder = ComputerBuilder()
[i for i in (self.builder.configure_memory(memory), self.builder.configure_hdd(hdd), self.builder.configure_gpu(gpu))] #此是list comprehension
@property
def computer(self):
return self.builder.computer
def main():
hdw =ComputerHardware ()
hdw.construct_computer(hdd=500, memory=8, gpu='GeForce GTX 650 Ti')
computer = hdw.computer
print(computer)
實際業務邏輯之場景如下:
if __name__ == '__main__':
main()
輸出:
Memory: 8GB
Hard Disk: 500GB
Graphics Card: GeForce GTX 650 Ti
總結:
建造者模式和工厂模式的的区别:
在工厂模式下会立即返回一个创建好的对象;而建造者模式下仅在需要时客户端才显式地请求指挥者向建造者提供心中理想的电脑规格以返回最终对象。在以下几种情况下与工厂模式相比,建造者模式是更好的选择:
- 想要创建一个由多个部分构成,且对象的创建要经过多个不同的步骤,且这些步骤还可依循特定的顺序。
- 要求一个对象能有不同的表现,且将对象的构造与表现解耦。