python建造者模式 自己的一点理解,和对旧知识的复习

本文通过实例解析建造者模式,演示如何使用MargaritaBuilder和CreamyBaconBuilder创建不同口味的披萨,包括玛格丽塔和奶油培根披萨的制作过程,揭示了指挥者与建造者之间的交互与合作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

"""
和工厂模式不一样,工厂模式是直接返回一个产品(或工厂),输入输出,相当直接,建造者模式就要辛苦一点,需要指挥者指挥建造者工作之后,才能获得产品,所以建造者模式需要指挥者和建造者两个角色。

① 建造者

建造者顾名思义,就是搬砖干活的,所以他应该有各种干活的能力,这样指挥者才好指挥他们干活,下面是一个能建酒店的建造者。

② 指挥者

指挥者毫无疑问就是指挥人干活的,虽然不用每事亲力亲为,但他需要很清楚干活的步骤,这样才能发挥他的领导才能。

③ 开始干活

把披萨建造者给指挥者,然后指挥者开始指挥,最后得到产品

"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值