使用多个简单的对象构造一个复杂的对象

使用场景

  1. 肯德基套餐场景

Demo

  1. """
  2. 建造者模式
  3. """
  4. from functools import reduce
  5. class Item:
  6. def name(self):
  7. raise NotImplementedError
  8. def packing(self):
  9. raise NotImplementedError
  10. def price(self):
  11. raise NotImplementedError
  12. class Packing:
  13. def pack(self):
  14. raise NotImplementedError
  15. class Wrapper(Packing):
  16. def pack(self):
  17. return 'wrapper'
  18. class Bottle(Packing):
  19. def pack(self):
  20. return 'bottle'
  21. class Burger(Item):
  22. def packing(self):
  23. return Wrapper()
  24. class VegBurger(Burger):
  25. def name(self):
  26. return 'vegburger'
  27. def price(self):
  28. return 33.2
  29. class ChickenBurger(Burger):
  30. def name(self):
  31. return "chickenburger"
  32. def price(self):
  33. return 35.1
  34. class ColdDrink(Item):
  35. def packing(self):
  36. return Bottle()
  37. class Pepsi(ColdDrink):
  38. def name(self):
  39. return self.__class__
  40. def price(self):
  41. return 10.2
  42. class Coke(ColdDrink):
  43. def name(self):
  44. return self.__class__
  45. def price(self):
  46. return 15.3
  47. class Meal:
  48. def __init__(self):
  49. self.items = []
  50. def add(self, item):
  51. self.items.append(item)
  52. def prices(self):
  53. return reduce(lambda x, y: x.price() + y.price(), self.items)
  54. class MealBuilder:
  55. def prepare_a_meal(self):
  56. meal = Meal()
  57. meal.add(ChickenBurger())
  58. meal.add(Coke())
  59. return meal
  60. def prepare_b_meal(self):
  61. meal = Meal()
  62. meal.add(Pepsi())
  63. meal.add(VegBurger())
  64. return meal
  65. if __name__ == '__main__':
  66. m_b = MealBuilder()
  67. a_meal = m_b.prepare_a_meal()
  68. print("a套餐的价格是:", a_meal.prices())
  69. b_meal = m_b.prepare_b_meal()
  70. print("b套餐的价格是:", b_meal.prices())