1. 程式人生 > >設計模式- 創建型模式, 建造者模式(2)

設計模式- 創建型模式, 建造者模式(2)

wait 設計模式 部件 add put AD progress port http

java23種設計模式之一,英文叫Builder Pattern。其核心思想是將一個“復雜對象的構建算法”與它的“部件及組裝方式”分離,使得構件算法和組裝方式可以獨立應對變化;復用同樣的構建算法可以創建不同的表示,不同的構建過程可以復用相同的部件組裝方式。

# coding: utf-8

from enum import Enum
import time

PizzaProgress = Enum(PizzaProgress, queued preparation baking 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.baking_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 margarita) 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.baking print(baking your margarita for {} seconds.format(self.baking_time)) time.sleep(self.baking_time) self.progress = PizzaProgress.ready print(your margarita is ready) class CreamyBaconBuilder: def __init__(self): self.pizza = Pizza(creamy bacon) self.progress = PizzaProgress.queued self.baking_time = 7 # 考慮是示例,單位為秒 def prepare_dough(self): self.progress = PizzaProgress.preparation self.pizza.prepare_dough(PizzaDough.thick) def add_sauce(self): print(adding the cre?me frai?che sauce to your creamy bacon) self.pizza.sauce = PizzaSauce.creme_fraiche time.sleep(STEP_DELAY) print(done with the cre?me frai?che sauce) def add_topping(self): print(adding the topping (mozzarella, bacon, ham, mushrooms, red onion, oregano) to your creamy bacon) self.pizza.topping.append([t for t in (PizzaTopping.mozzarella, PizzaTopping.bacon, PizzaTopping.ham, PizzaTopping.mushrooms, PizzaTopping.red_onion, PizzaTopping.oregano)]) time.sleep(STEP_DELAY) print(done with the topping (mozzarella, bacon, ham, mushrooms, red onion, oregano)) def bake(self): self.progress = PizzaProgress.baking print(baking your creamy bacon for {} seconds.format(self.baking_time)) time.sleep(self.baking_time) self.progress = PizzaProgress.ready print(your creamy bacon is ready) class Waiter: def __init__(self): self.builder = None ## 實例屬性最好寫在__init__裏面,哪怕屬性不是在初始化時候綁定或者建立,也有寫個None,聲明一下屬性,否則直接在普通方法生成一個實例屬性,不符合pycharm的pep8。 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(What pizza would you like, [m]argarita or [c]reamy bacon? ) builder = builders[pizza_style]() valid_input = True except KeyError as err: print(Sorry, only margarita (key m) and creamy bacon (key c) are available) 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(Enjoy your {}!.format(pizza)) if __name__ == __main__: main()

看代碼先從main函數看起,不是從上往下一行行看。

設計模式- 創建型模式, 建造者模式(2)