建造者模式: 使用多个简单的对象一步一步构建成一个复杂对象 使用场景: 1、需要生成的对象具有复杂的内部结构 2、需要生成的对象内部属性本身相互依赖 使用实例: 例如麦当劳中的可乐、薯条、汉堡是不变的,组合推出的「套餐」是经常变化的 实现步骤: 1、创建对象产品的抽象产品类(定义组成套餐的食物) 2、创建构建者抽象类:主要定义构建者通用属性、方法,以及继承者必须实现的功能抽象 3、创建具体创建者类(比如儿童套餐创建者类、成人套餐创建者类) 4、创建产品的指挥类,即最终给客户提供的产品的实例对象以及组装过程(相当于麦当劳给你装餐的工作人员)

    参考文档:https://github.com/ydf0509/python36patterns/blob/master/%E5%88%9B%E5%BB%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F-%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F.py

    1. import abc
    2. from abc import abstractmethod
    3. # 步骤一:创建对象产品的抽象产品类
    4. class Building(object):
    5. def __init__(self):
    6. # 套餐组成
    7. self.cola = None
    8. self.french_fries = None
    9. self.hamburger = None
    10. # 步骤二:创建构建者抽象类:主要定义构建者通用属性、方法,以及继承者必须实现的功能抽象
    11. class AbsBuilder(object):
    12. def __init__(self):
    13. print("创建构建者抽象类初始化")
    14. self.building = None
    15. def new_building(self):
    16. print("创建构建者抽象类 new_building 方法")
    17. self.building = Building()
    18. @abc.abstractmethod
    19. def build_food(self):
    20. print("创建构建者抽象类 build_food 方法")
    21. pass
    22. # 步骤三:创建具体创建者类
    23. class ChildrenFoodBuilder(AbsBuilder):
    24. """儿童套餐创建者类"""
    25. def build_food(self):
    26. print(f"儿童套餐创建者类 build_food 方法")
    27. self.cola = "小杯"
    28. self.french_fries = "小薯"
    29. self.hamburger = "麦香汉堡"
    30. class AdultFoodBuilder(AbsBuilder):
    31. """成年人套餐创建者类"""
    32. def build_food(self):
    33. self.cola = "大杯"
    34. self.french_fries = "大薯"
    35. self.hamburger = "巨无霸汉堡"
    36. # 步骤四:创建产品的指挥类,即最终给客户提供的产品的实例对象以及组装过程(相当于麦当劳给你装餐的工作人员)
    37. class Director(object):
    38. def __init__(self):
    39. print("创建产品的指挥类 初始化")
    40. self.builder = None
    41. def construst_building(self):
    42. """建造者模式下, 仅在需要时客户端代码才会显式的请求指挥着返回最终对象"""
    43. print("创建产品的指挥类 construst_building 方法")
    44. self.builder.new_building()
    45. self.builder.build_food()
    46. def get_building(self):
    47. print("创建产品的指挥类 get_building 方法")
    48. return f"当前套餐是:可乐={self.builder.cola}, 薯条={self.builder.french_fries}, 汉堡={self.builder.hamburger}"
    49. class Client(object):
    50. def build(self, build_type):
    51. if build_type == "children":
    52. # 创建产品的指挥类 初始化
    53. director = Director()
    54. # 创建「儿童套餐」构建者抽象类初始化
    55. builder = ChildrenFoodBuilder()
    56. # 指定「儿童套餐」构建者
    57. director.builder = builder
    58. # 开始构建套餐
    59. director.construst_building()
    60. # 获取套餐
    61. building = director.get_building()
    62. print(building)
    63. elif build_type == "adult":
    64. director = Director()
    65. builder = AdultFoodBuilder()
    66. director.builder = builder
    67. director.construst_building()
    68. building = director.get_building()
    69. print(building)
    70. if __name__ == "__main__":
    71. build_type = "children"
    72. client = Client()
    73. client.build(build_type)
    74. """
    75. 创建产品的指挥类 初始化
    76. 创建构建者抽象类初始化
    77. 创建产品的指挥类 construst_building 方法
    78. 创建构建者抽象类 new_building 方法
    79. 儿童套餐创建者类 build_food 方法
    80. 创建产品的指挥类 get_building 方法
    81. 当前套餐是:可乐=小杯, 薯条=小薯, 汉堡=麦香汉堡
    82. """