建造者模式: 使用多个简单的对象一步一步构建成一个复杂对象 使用场景: 1、需要生成的对象具有复杂的内部结构 2、需要生成的对象内部属性本身相互依赖 使用实例: 例如麦当劳中的可乐、薯条、汉堡是不变的,组合推出的「套餐」是经常变化的 实现步骤: 1、创建对象产品的抽象产品类(定义组成套餐的食物) 2、创建构建者抽象类:主要定义构建者通用属性、方法,以及继承者必须实现的功能抽象 3、创建具体创建者类(比如儿童套餐创建者类、成人套餐创建者类) 4、创建产品的指挥类,即最终给客户提供的产品的实例对象以及组装过程(相当于麦当劳给你装餐的工作人员)
import abc
from abc import abstractmethod
# 步骤一:创建对象产品的抽象产品类
class Building(object):
def __init__(self):
# 套餐组成
self.cola = None
self.french_fries = None
self.hamburger = None
# 步骤二:创建构建者抽象类:主要定义构建者通用属性、方法,以及继承者必须实现的功能抽象
class AbsBuilder(object):
def __init__(self):
print("创建构建者抽象类初始化")
self.building = None
def new_building(self):
print("创建构建者抽象类 new_building 方法")
self.building = Building()
@abc.abstractmethod
def 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 = None
def 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 = builder
director.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 方法
当前套餐是:可乐=小杯, 薯条=小薯, 汉堡=麦香汉堡
"""