Skip to content

设计模式之建造者模式

知之者不如好之者,好之者不如乐之者。

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)

当然这里的具体建造者可以写多个

优点

隐藏了一个产品的内部结构、装配过程和顺序

将构造代码与表示代码分开,可以对构造过程进行更加精细的控制