又称生成器,是一种创建型设计模式,使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
建造者模式
例:复用相同的对象构造代码来生成不同类型的产品——例如汽车 (Car)——及其相应的使用手册 (Manual)。
"""
class Car:
"""产品类"""
def __init__(self):
self.brand = None
self.seats = None
self.engine = None
self.trip_computer = None
self.gps = None
def __str__(self):
return "汽车概况:\n " + f"{self.__dict__}"
class Manual:
"""使用手册类"""
def __init__(self):
self.sections = []
def add_section(self, feature, description):
self.sections.append((feature, description))
def __str__(self):
return "使用手册:\n " + "\n ".join(
f"{feature} - {description}" for feature, description in self.sections
)
class CarBuilder:
"""生成器类"""
def __init__(self):
self._manual = None
self._car = None
self.reset()
def reset(self):
self._car = Car()
self._manual = Manual()
def set_brand(self, brand):
self._car.brand = brand
self._manual.add_section("Brand", f"这辆车的品牌是 {brand}")
return self
def set_seats(self, seats):
self._car.seats = seats
self._manual.add_section("Seats", f"这辆车有 {seats} 个座位")
return self
def set_engine(self, engine):
self._car.engine = engine
self._manual.add_section("Engine", f"这辆车配备了一个 {engine} 引擎")
return self
def set_trip_computer(self, trip_computer):
self._car.trip_computer = trip_computer
if trip_computer:
self._manual.add_section("Trip Computer", "这辆汽车装有行车电脑。")
return self
def set_gps(self, gps):
self._car.gps = gps
if gps:
self._manual.add_section("GPS", "这辆汽车装有全球定位系统(GPS)。")
return self
def get_car(self):
return self._car
def get_manual(self):
return self._manual
class Director:
"""
主管类
主管只负责按照特定顺序执行生成步骤。由于客户端可以直接控制生成器,所以严格意义上来说,主管类并不是必需的。
"""
@staticmethod
def construct_sports_car1(builder):
builder.reset()
builder.set_brand("宝马").set_seats(4).set_engine("SportEngine").set_trip_computer(True).set_gps(True)
@staticmethod
def construct_sports_car2(builder):
builder.reset()
builder.set_brand("奔驰").set_seats(6)
def client_code():
"""客户端代码"""
director = Director()
# 构建汽车和使用手册
car_builder = CarBuilder()
director.construct_sports_car1(car_builder)
print(car_builder.get_car())
print(car_builder.get_manual())
print()
director.construct_sports_car2(car_builder)
print(car_builder.get_car())
print(car_builder.get_manual())
if __name__ == "__main__":
"""
汽车概况:
{'brand': '宝马', 'seats': 4, 'engine': 'SportEngine', 'trip_computer': True, 'gps': True}
使用手册:
Brand - 这辆车的品牌是 宝马
Seats - 这辆车有 4 个座位
Engine - 这辆车配备了一个 SportEngine 引擎
Trip Computer - 这辆汽车装有行车电脑。
GPS - 这辆汽车装有全球定位系统(GPS)。
汽车概况:
{'brand': '奔驰', 'seats': 6, 'engine': None, 'trip_computer': None, 'gps': None}
使用手册:
Brand - 这辆车的品牌是 奔驰
Seats - 这辆车有 6 个座位
"""
client_code()
更多【python-【Python笔记-设计模式】建造者模式】相关视频教程:www.yxfzedu.com