什么时候用到:
如果我们知道一个对象必须经过多个步骤来创建,并且要求同一个构造过程可以产生不同的表现,这就需要用到建造模式。
该模式中,有两个参与者:建造者和指挥者。建造者负责创建复杂对象的各个组成部分。
指挥者使用一个建造者势力控制建造过的过程
建造者模式和工厂模式的区别:
这两个区别不太明确,主要的区别在于工厂模式以单个步骤创建对象,而建造者模式以多个步骤创建对象,并且几乎始终一个指挥者。
另一个区别:在工厂模式下,会立即返回一个创建好的对象;而在建造者模式下,仅在需要时客户端代码才显式地请求指挥着返回最终对象和网页。
建造者实例1:
$cat builder.py
#encoding:utf8
class Computer(object):
def __init__(self,serial_number):
self.serial = serial_number
self.memory = serial_number
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(object):
def __init__(self):
self.computer = Computer("AG23385193")
def configure_memory(self,memory):
self.computer.memory = memory
def configure_hdd(self,hdd):
self.computer.hdd = hdd
def configure_gpu(self,gpu):
self.computer.gpu = gpu
class HardwareEngineer(object):
def __init__(self):
self.builder = None
def construct_computer(self,memory,hdd,gpu):
self.builder = ComputerBuilder()
self.builder.configure_memory(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(8,500,"GeFore GTX 650 Ti")
computer = engineer.computer
print computer
if __name__ == "__main__":
main()
$python builder.py
Memory:8GB
Hard Disk:500GB
Graphics Card:GeFore GTX 650 Ti
引入一个建造者 ComputerBuilder 、一个指挥者HardwareEngineer以及一步接一步装配一台电脑的过程。