1. 什么是构建模式
构建模式(Builder Pattern)是一种创建型设计模式,它允许使用多个简单的对象一步步构建一个复杂的对象。构建模式通过将构建过程与表示分离,使得同样的构建过程可以创建不同的表示。换句话说,构建模式提供了一种灵活的方式来创建复杂对象,避免了构造函数参数过多的问题。
- 工厂模式通过一个工厂类来创建对象,适合于创建多个相似对象,隐藏了对象创建的具体实现。
- 构建模式通过构建者和指挥者的组合,逐步构建一个复杂对象,适合于需要多个步骤和多个部分的组合。
- 组合模式则允许将对象组合成树形结构,适合于处理部分和整体的层次关系。
1.1 工厂模式与构建模式的对比
在工厂模式中,我们将创建一个简单的汽车工厂来生成汽车对象。
class Car:def __init__(self, make, model):self.make = makeself.model = modeldef __str__(self):return f"{self.make} {self.model}"class CarFactory:@staticmethoddef create_car(make, model):return Car(make, model)# 客户端代码
if __name__ == "__main__":car1 = CarFactory.create_car("Toyota", "Camry")car2 = CarFactory.create_car("Honda", "Accord")print(car1) # 输出: Toyota Camryprint(car2) # 输出: Honda Accord
在构建模式中,我们将使用构建者模式逐步构建一个复杂的汽车对象。
# 产品类
class Car:def __init__(self):self.make = Noneself.model = Noneself.year = Noneself.color = Nonedef __str__(self):return f"{self.year} {self.color} {self.make} {self.model}"# 构建者接口
class CarBuilder:def set_make(self, make):passdef set_model(self, model):passdef set_year(self, year):passdef set_color(self, color):passdef build(self):pass# 具体构建者
class ConcreteCarBuilder(CarBuilder):def __init__(self):self.car = Car()def set_make(self, make):self.car.make = makedef set_model(self, model):self.car.model = modeldef set_year(self, year):self.car.year = yeardef set_color(self, color):self.car.color = colordef build(self):return self.car# 指挥者
class Director:def __init__(self, builder):self.builder = builderdef construct_car(self, make, model, year, color):self.builder.set_make(make)self.builder.set_model(model)self.builder.set_year(year)self.builder.set_color(color)return self.builder.build()# 客户端代码
if __name__ == "__main__":builder = ConcreteCarBuilder()director = Director(builder)# 构建一辆车car = director.construct_car("Toyota", "Camry", 2022, "Blue")print(car) # 输出: 2022 Blue Toyota Camry
1.2 组合模式与构建模式的对比
在组合模式中,我们将创建一个文件系统的结构,允许文件和文件夹以树形结构组合。
class Component:def operation(self):passclass File(Component):def __init__(self, name):self.name = namedef operation(self):return f"File: {self.name}"class Folder(Component):def __init__(self, name):self.name = nameself.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def operation(self):results = [f"Folder: {self.name}"]for child in self.children:results.append(child.operation())return "\n".join(results)# 客户端代码
if __name__ == "__main__":file1 = File("file1.txt")file2 = File("file2.txt")folder1 = Folder("Folder 1")folder1.add(file1)folder1.add(file2)print(folder1.operation())
在构建模式中,我们将使用构建者模式逐步构建一个复杂的文件对象。
class File:def __init__(self, name):self.name = namedef __str__(self):return f"File: {self.name}"class Folder:def __init__(self, name):self.name = nameself.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def __str__(self):results = [f"Folder: {self.name}"]for child in self.children:results.append(str(child))return "\n".join(results)class FileBuilder:def __init__(self):self.folder = Nonedef create_folder(self, name):self.folder = Folder(name)def add_file(self, file_name):if self.folder:self.folder.add(File(file_name))def build(self):return self.folder# 客户端代码
if __name__ == "__main__":builder = FileBuilder()builder.create_folder("Folder 1")builder.add_file("file1.txt")builder.add_file("file2.txt")folder = builder.build()print(folder) # 输出: Folder: Folder 1\nFile: file1.txt\nFile: file2.txt
2. 构建模式的结构
构建模式通常包含以下几个角色:
- 产品(Product):表示被构建的复杂对象。
- 构建者(Builder):定义了创建产品的抽象接口,包含构建产品的各个部分的方法。
- 具体构建者(ConcreteBuilder):实现了构建者接口,负责构建产品的具体部分。
- 指挥者(Director):负责管理构建过程,使用构建者来构建产品。
# 产品类
class Car:def __init__(self):self.make = Noneself.model = Noneself.year = Noneself.color = Nonedef __str__(self):return f"{self.year} {self.color} {self.make} {self.model}"# 构建者接口
class CarBuilder:def set_make(self, make):passdef set_model(self, model):passdef set_year(self, year):passdef set_color(self, color):passdef build(self):pass# 具体构建者
class ConcreteCarBuilder(CarBuilder):def __init__(self):self.car = Car()def set_make(self, make):self.car.make = makedef set_model(self, model):self.car.model = modeldef set_year(self, year):self.car.year = yeardef set_color(self, color):self.car.color = colordef build(self):return self.car# 指挥者
class Director:def __init__(self, builder):self.builder = builderdef construct_car(self, make, model, year, color):self.builder.set_make(make)self.builder.set_model(model)self.builder.set_year(year)self.builder.set_color(color)return self.builder.build()# 客户端代码
if __name__ == "__main__":builder = ConcreteCarBuilder()director = Director(builder)# 构建一辆车car = director.construct_car("Toyota", "Camry", 2022, "Blue")print(car) # 输出: 2022 Blue Toyota Camry
-
产品类(Car):表示被构建的复杂对象,包含多个属性(如品牌、型号、年份和颜色),并实现了一个
__str__
方法用于输出对象的字符串表示。 -
构建者接口(CarBuilder):定义了创建产品的抽象接口,包含设置汽车各个属性的方法。
-
具体构建者(ConcreteCarBuilder):实现了构建者接口,负责实现构建汽车的具体部分。它创建一个
Car
对象并逐步设置其属性,最后返回构建好的Car
对象。 -
指挥者(Director):负责管理构建过程,使用构建者来构建产品。它接受一个构建者对象,并通过调用构建者的方法来构建一个完整的
Car
对象。 -
客户端代码:创建了一个
ConcreteCarBuilder
实例和一个Director
实例。通过指挥者的construct_car
方法,逐步构建了一辆汽车,并最终输出了构建好的汽车对象。
3. 示例 1:构建复杂的餐厅订单系统
在日常开发中,构建模式常用于构建复杂对象的场景。一个典型的例子是餐厅订单系统。在这个系统中,顾客可以选择不同的菜品、饮料和配餐,最终生成一个完整的订单。使用构建模式可以有效地管理这个复杂的构建过程。
在这个示例中,我们将创建一个订单对象,顾客可以通过不同的步骤来构建这个订单。我们将定义以下角色:
- 产品(Order):表示顾客的订单,包含多个菜品和饮料。
- 构建者(OrderBuilder):定义了创建订单的抽象接口,包含添加菜品和饮料的方法。
- 具体构建者(ConcreteOrderBuilder):实现了构建者接口,负责构建订单的具体部分。
- 指挥者(Director):负责管理构建过程,使用构建者来构建订单。
# 产品类
class Order:def __init__(self):self.dishes = []self.drinks = []def add_dish(self, dish):self.dishes.append(dish)def add_drink(self, drink):self.drinks.append(drink)def __str__(self):order_details = "Order Details:\n"order_details += "Dishes:\n" + "\n".join(self.dishes) + "\n"order_details += "Drinks:\n" + "\n".join(self.drinks)return order_details# 构建者接口
class OrderBuilder:def add_dish(self, dish):passdef add_drink(self, drink):passdef build(self):pass# 具体构建者
class ConcreteOrderBuilder(OrderBuilder):def __init__(self):self.order = Order()def add_dish(self, dish):self.order.add_dish(dish)def add_drink(self, drink):self.order.add_drink(drink)def build(self):return self.order# 指挥者
class Director:def __init__(self, builder):self.builder = builderdef construct_order(self, dishes, drinks):for dish in dishes:self.builder.add_dish(dish)for drink in drinks:self.builder.add_drink(drink)return self.builder.build()# 客户端代码
if __name__ == "__main__":builder = ConcreteOrderBuilder()director = Director(builder)# 构建一个订单dishes = ["Spaghetti", "Caesar Salad", "Grilled Chicken"]drinks = ["Coke", "Water"]order = director.construct_order(dishes, drinks)print(order) # 输出订单详情
Order Details:
Dishes:
Spaghetti
Caesar Salad
Grilled Chicken
Drinks:
Coke
Water
-
产品类(Order):表示顾客的订单,包含多个菜品和饮料。它提供了添加菜品和饮料的方法,并实现了一个
__str__
方法用于输出订单的详细信息。 -
构建者接口(OrderBuilder):定义了创建订单的抽象接口,包含添加菜品和饮料的方法。
-
具体构建者(ConcreteOrderBuilder):实现了构建者接口,负责构建订单的具体部分。它创建一个
Order
对象并逐步添加菜品和饮料,最后返回构建好的订单对象。 -
指挥者(Director):负责管理构建过程,使用构建者来构建订单。它接受一个构建者对象,并通过调用构建者的方法来构建一个完整的订单对象。
-
客户端代码:创建了一个
ConcreteOrderBuilder
实例和一个Director
实例。通过指挥者的construct_order
方法,逐步构建了一个订单,并最终输出了订单的详细信息。