from enum import Enum
import time
PIzzaProgress = Enum("PIzzaProgress", "queued preparation bakeing ready")
PIzzaDough = Enum("PIzzaDough", "thin thick")
PIzzaSauce = Enum("PIzzaSauce", "tomato creme_fraiche")
PIzzaTopping = Enum("PIzzaTopping", "mozzarella double_mozzarella bacon ham mushrooms red_onion oregano")
STEP_DELAY = 3
class Pizza():
def __init__(self, name):
self.name = name
self.dough = None
self.sauce = None
self.topping = []
def __str__(self):
return self.name
def prepare_dough(self, dough):
self.dough = dough
print("preparing the {} dough of your {} ...".format(self.dough.name, self))
time.sleep(STEP_DELAY)
print('done with the {} dough'.format(self.dough.name))
class MargaritaBuilder():
""" 玛丽苏披萨制作流程"""
def __init__(self):
self.pizza = Pizza("margarita")
self.progress = PIzzaProgress.queued
self.backing_time = 5
def prepare_dough(self):
self.progress = PIzzaProgress.preparation
self.pizza.prepare_dough(PIzzaDough.thin)
def add_sauce(self):
print("adding the tomato sauce to your margarita ...")
self.pizza.sauce = PIzzaSauce.tomato
time.sleep(STEP_DELAY)
print("done with the tomato sauce")
def add_topping(self):
print("adding the topping (double mozzarella, oregano) to your margraita")
self.pizza.topping.append([i for i in (PIzzaTopping.double_mozzarella, PIzzaTopping.oregano)])
time.sleep(STEP_DELAY)
print(" done with the topping (double mozzarrella, oregano)")
def bake(self):
self.progress = PIzzaProgress.bakeing
print("baking your margraita for {} seconds ".format(self.backing_time))
self.progress = PIzzaProgress.ready
print("your margarita is ready ")
class CreamyBaconBuilder():
pass
class Waiter():
def __init__(self):
self.builder = None
def construct_pizza(self, builder):
self.builder = builder
[step() for step in (builder.prepare_dough,builder.add_sauce, builder.add_topping, builder.bake)]
@property
def pizza(self):
return self.builder.pizza
def validate_style(builders):
try:
pizza_style = input("你喜欢什么为的披萨, [m]玛丽苏味 or [c] 奶油 [b]咸肉?")
builder = builders[pizza_style]()
valid_input = True
except KeyError as err:
print("对不起,您的输入有误,")
return (False, None)
return (True, builder)
def main():
builders = dict(m=MargaritaBuilder, c=CreamyBaconBuilder)
valid_input= False
while not valid_input:
valid_input, builder = validate_style(builders)
print()
waiter = Waiter()
waiter.construct_pizza(builder)
pizza = waiter.pizza
print()
print("请享受你的{}".format(pizza))
if __name__ == '__main__':
main()
"""
和工厂模式不一样,工厂模式是直接返回一个产品(或工厂),输入输出,相当直接,建造者模式就要辛苦一点,需要指挥者指挥建造者工作之后,才能获得产品,所以建造者模式需要指挥者和建造者两个角色。
① 建造者
建造者顾名思义,就是搬砖干活的,所以他应该有各种干活的能力,这样指挥者才好指挥他们干活,下面是一个能建酒店的建造者。
② 指挥者
指挥者毫无疑问就是指挥人干活的,虽然不用每事亲力亲为,但他需要很清楚干活的步骤,这样才能发挥他的领导才能。
③ 开始干活
把披萨建造者给指挥者,然后指挥者开始指挥,最后得到产品
"""