建造者模式

浏览 1174

课文

建造者模式(Builder Pattern)

情景

李华是一位赛百味员工,每天负责准备好三明治的原料,并按需要提供给顾客:

# 定义一个三明治类,并准备材料:
class Sandwich:
    def __init__(self):
        # 先准备面包,再夹肉,最后挤上酱料
        self.build_bread()
        self.build_meat()
        self.build_sauce()
        self.show_sandwich()

    # 定义好上面所用的四个方法,其中前三个方法如果子类不改写就会报错
    def build_bread(self):
        raise NotImplementedError("没有准备面包")

    def build_meat(self):
        raise NotImplementedError("没有夹肉")

    def build_sauce(self):
        raise NotImplementedError("没有挤上酱料")

    def show_sandwich(self):
        print("面包:" + self.bread)
        print("肉:" + self.meat)
        print("酱料:" + self.sauce)


# 菜单中有健身三明治以及香香三明治,他们都继承了三明治类
class Fitness(Sandwich):
    def build_bread(self):
        self.bread = "全麦面包"

    def build_meat(self):
        self.meat = "鸡胸肉"

    def build_sauce(self):
        self.sauce = "黑椒酱"


class Spicy(Sandwich):
    def build_bread(self):
        self.bread = "白面包"

    def build_meat(self):
        self.meat = "炸猪排"

    def build_sauce(self):
        self.sauce = "千岛酱"

这时候,小肥点了一个香香三明治:

xiaofei_sandwich = Spicy()

输出:

面包:白面包
肉:炸猪排
酱料:千岛酱

这就是建造者模式。

正文

或许有同学看到这里会一脸疑问:建造者模式这么简单的吗?

没错,在 python 里实现它就是这么简单,在类初始化时按步骤调用自身的方法就可以了。

我们来看看建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。继续套用上面的例子:三明治作为一个「复杂对象」,由面包、肉与酱料构成,这三种东西根据其种类的不同,排列组合能创建出非常多种三明治,即「不同的表示」;而「准备面包 → 夹肉 → 挤酱料」则是「同样的构建过程」,使得我们只要根据这个创建过程就能够稳定创造出三明治对象。

有时在一些非常复杂的逻辑的情况下,甚至需要将初始化函数的逻辑单独提出来放在另一个函数中:

class Sandwich:
    def show_sandwich(self):
        print("面包:" + self.bread)
        print("肉:" + self.meat)
        print("酱料:" + self.sauce)

# 此时父类与子类都没有有用的构造函数
class ComplexSandwich:
    def build_bread(self):
        self.bread = "复杂面包"

    def build_meat(self):
        self.meat = "复杂肉排"

    def build_sauce(self):
        self.sauce = "复杂酱"

def complex_build(sandwich, **args, **kwargs):,:
    s = sandwich()

    # 创建过程中可以穿插非常多的逻辑
    s.build_bread()
    s.build_meat()
    s.build_sauce()

    return s

当然多数情况下这种写法没有必要,此处仅供参考。

实战

1.设计一个电脑类,并按照「主机 → 显示器 → 键盘 → 鼠标」的步骤创建它,并在最后打印「组装完成」。

解析

1.设计一个电脑类,并按照「主机 → 显示器 → 键盘 → 鼠标」的步骤创建它,并在最后打印「组装完成」。

class Computer:
    def __init__(self):
        self.add_mainframe()
        self.add_monitor()
        self.add_keyboard()
        self.add_mouse()
        print("组装完成")


class MyComputer(Computer):
    def add_mainframe(self):
        self.mainframe = "主机"

    def add_monitor(self):
        self.monitor = "显示器"

    def add_keyboard(self):
        self.keyboard = "键盘"

    def add_mouse(self):
        self.mouse = "鼠标"

mypc = MyComputer()

输出:

组装完成
点击查看

评论

登录参与讨论

暂无评论

共 0 条
  • 1
前往
  • 1