建造者模式: 使用多个简单的对象一步一步构建成一个复杂对象 使用场景: 1、需要生成的对象具有复杂的内部结构 2、需要生成的对象内部属性本身相互依赖 使用实例: 例如麦当劳中的可乐、薯条、汉堡是不变的,组合推出的「套餐」是经常变化的 实现步骤: 1、创建对象产品的抽象产品类(定义组成套餐的食物) 2、创建构建者抽象类:主要定义构建者通用属性、方法,以及继承者必须实现的功能抽象 3、创建具体创建者类(比如儿童套餐创建者类、成人套餐创建者类) 4、创建产品的指挥类,即最终给客户提供的产品的实例对象以及组装过程(相当于麦当劳给你装餐的工作人员)
import abcfrom abc import abstractmethod# 步骤一:创建对象产品的抽象产品类class Building(object):def __init__(self):# 套餐组成self.cola = Noneself.french_fries = Noneself.hamburger = None# 步骤二:创建构建者抽象类:主要定义构建者通用属性、方法,以及继承者必须实现的功能抽象class AbsBuilder(object):def __init__(self):print("创建构建者抽象类初始化")self.building = Nonedef new_building(self):print("创建构建者抽象类 new_building 方法")self.building = Building()@abc.abstractmethoddef build_food(self):print("创建构建者抽象类 build_food 方法")pass# 步骤三:创建具体创建者类class ChildrenFoodBuilder(AbsBuilder):"""儿童套餐创建者类"""def build_food(self):print(f"儿童套餐创建者类 build_food 方法")self.cola = "小杯"self.french_fries = "小薯"self.hamburger = "麦香汉堡"class AdultFoodBuilder(AbsBuilder):"""成年人套餐创建者类"""def build_food(self):self.cola = "大杯"self.french_fries = "大薯"self.hamburger = "巨无霸汉堡"# 步骤四:创建产品的指挥类,即最终给客户提供的产品的实例对象以及组装过程(相当于麦当劳给你装餐的工作人员)class Director(object):def __init__(self):print("创建产品的指挥类 初始化")self.builder = Nonedef construst_building(self):"""建造者模式下, 仅在需要时客户端代码才会显式的请求指挥着返回最终对象"""print("创建产品的指挥类 construst_building 方法")self.builder.new_building()self.builder.build_food()def get_building(self):print("创建产品的指挥类 get_building 方法")return f"当前套餐是:可乐={self.builder.cola}, 薯条={self.builder.french_fries}, 汉堡={self.builder.hamburger}"class Client(object):def build(self, build_type):if build_type == "children":# 创建产品的指挥类 初始化director = Director()# 创建「儿童套餐」构建者抽象类初始化builder = ChildrenFoodBuilder()# 指定「儿童套餐」构建者director.builder = builder# 开始构建套餐director.construst_building()# 获取套餐building = director.get_building()print(building)elif build_type == "adult":director = Director()builder = AdultFoodBuilder()director.builder = builderdirector.construst_building()building = director.get_building()print(building)if __name__ == "__main__":build_type = "children"client = Client()client.build(build_type)"""创建产品的指挥类 初始化创建构建者抽象类初始化创建产品的指挥类 construst_building 方法创建构建者抽象类 new_building 方法儿童套餐创建者类 build_food 方法创建产品的指挥类 get_building 方法当前套餐是:可乐=小杯, 薯条=小薯, 汉堡=麦香汉堡"""
