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 # dough 面团
self.sauce = None # sauce 调味品
self.topping = [] # 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]() # 根据字典键取值 builders[m]() 类实例化 并生成对象builder
# 将顾客选择好的披萨(建造者) 返回给指挥者
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()
"""
和工厂模式不一样,工厂模式是直接返回一个产品(或工厂),输入输出,相当直接,建造者模式就要辛苦一点,需要指挥者指挥建造者工作之后,才能获得产品,所以建造者模式需要指挥者和建造者两个角色。
① 建造者
建造者顾名思义,就是搬砖干活的,所以他应该有各种干活的能力,这样指挥者才好指挥他们干活,下面是一个能建酒店的建造者。
② 指挥者
指挥者毫无疑问就是指挥人干活的,虽然不用每事亲力亲为,但他需要很清楚干活的步骤,这样才能发挥他的领导才能。
③ 开始干活
把披萨建造者给指挥者,然后指挥者开始指挥,最后得到产品
"""
python建造者模式 自己的一点理解,和对旧知识的复习
最新推荐文章于 2024-07-12 17:30:22 发布