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

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

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

① 建造者

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

② 指挥者

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

③ 开始干活

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

"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建造者模式是一种创建型设计模式,旨在通过将对象的构造与其表示分离来解决复杂对象的创建问题。该模式允许您按照步骤构建对象,同时也提供一种灵活的方式来创建不同类型的对象。 在Python中,建造者模式通常使用类和方法来实现。以下是一个基本的建造者模式示例: ```python class Computer: def __init__(self): self.__monitor = None self.__keyboard = None self.__mouse = None def set_monitor(self, monitor): self.__monitor = monitor def set_keyboard(self, keyboard): self.__keyboard = keyboard def set_mouse(self, mouse): self.__mouse = mouse class ComputerBuilder: def __init__(self): self.__computer = Computer() def get_computer(self): return self.__computer def build_monitor(self): monitor = "Dell Monitor" self.__computer.set_monitor(monitor) def build_keyboard(self): keyboard = "Logitech Keyboard" self.__computer.set_keyboard(keyboard) def build_mouse(self): mouse = "Microsoft Mouse" self.__computer.set_mouse(mouse) class Director: def __init__(self, builder): self.__builder = builder def build_computer(self): self.__builder.build_monitor() self.__builder.build_keyboard() self.__builder.build_mouse() builder = ComputerBuilder() director = Director(builder) director.build_computer() computer = builder.get_computer() ``` 在上面的示例中,我们定义了一个Computer类,它包含了电脑的一些属性,如显示器、键盘和鼠标等。我们还定义了一个ComputerBuilder类,它允许我们按照步骤构建Computer对象。最后,我们定义了一个Director类,它协调ComputerBuilder的构建过程。 当我们需要创建一个新的Computer对象时,我们只需创建一个ComputerBuilder实例并将其传递给Director类。Director类将协调ComputerBuilder的构建过程,并返回一个完整的Computer对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值