建造者模式
浏览 1378
课文
建造者模式(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()
输出:
组装完成
评论
暂无评论