设计模式之建造者模式¶
知之者不如好之者,好之者不如乐之者。
Author: 李东阳
1、什么是建造者模式¶
将一个复杂对象的构造和表示分离,同样的构建过程可以创建不同的东西。
建造者模式与抽象工厂模式相似,也用来创建复杂对象
主要区别在于建造者模式着重于一步步构建一个复杂的对象,而抽象工厂模式着重于多个系列的产品对象。
角色:¶
抽象建造者(Bulider)、具体建造者(Concrete Builder)、指挥者(Director)、产品(Product)
2、 建造者模式的实现¶
首先我们需要写一个抽象建造者,抽象建造者是一个抽象类,里面定义了一些抽象建造方法。抽象建造者的抽象方法交由具体建造者去实现。指挥者也是一个类,这个类主要用来控制建造的顺序。产品类的话就是描述了这个产品的一些属性。
举个例子:
像大家经常玩的王者农药,大家每选择一个英雄玩一局游戏就可以用建造者模式来实现。比如说,我选择玩后羿,那么后羿在建造者模式中他就是一个产品类,后羿就有他的属性:脸部建模、身体建模、胳膊建模、腿部建模。那我们就拿代码来实现以下吧
。
from abc import ABCMeta, abstractmethod
# 产品
class Hero:
def __init__(self, face=None, body=None, arm=None, leg=None):
self.face = face
self.body = body
self.arm = arm
self.leg = leg
def __str__(self):
return "{},{},{},{}".format(self.face, self.body, self.arm, self.leg)
# 抽象建造者
class HeroBuilder(metaclass=ABCMeta):
@abstractmethod
def create_face(self):
pass
@abstractmethod
def create_body(self):
pass
@abstractmethod
def create_arm(self):
pass
@abstractmethod
def create_leg(self):
pass
# 具体建造者
class HouYiBuilder(HeroBuilder):
def __init__(self):
self.hero = Hero()
def create_face(self):
self.hero.face = "后羿的脸"
def create_body(self):
self.hero.body = "后羿的身体"
def create_arm(self):
self.hero.arm = "后羿的手臂"
def create_leg(self):
self.hero.leg = "后羿的腿"
# 指挥者
class Director:
def create_step(self, builder):
builder.create_leg()
builder.create_body()
builder.create_arm()
builder.create_face()
return builder.hero
if __name__ == '__main__':
b = HouYiBuilder()
d = Director()
houyi = d.create_step(b)
print(houyi)
当然这里的具体建造者可以写多个
优点¶
隐藏了一个产品的内部结构、装配过程和顺序
将构造代码与表示代码分开,可以对构造过程进行更加精细的控制