建造者模式
建造者模式的目的在于分步骤构造复杂对象,通过将对象构建过程与其表示分离,使得同样的构造过程可以创建不同的对象形态。
特点
- 解耦构建与装配:将对象的创建步骤抽象为独立的构造器
- 灵活扩展:允许通过不同的具体建造者生成不同表现形式的对象
模式结构
角色 | 职责 |
---|---|
抽象建造者(Builder) | 定义创建产品实例的各个部件的抽象接口 |
具体建造者(ConcreteBuilder) | 实现抽象建造者所定义的接口,创建一个复杂对象的各个部件 |
指挥者(Director) | 控制构建流程,按顺序调用抽象建造者所定义的接口方法,完成复杂对象的创建 |
产品(Product) | 由复杂对象的各个部件组成 |
要辨别是否套用了建造者模式,只需要确认是否存在上述4个角色。
简单示例
python
class Car: # 产品
def __init__(self):
self.engine = None
self.wheels = None
def __str__(self):
return f'Engine: {self.engine}, Wheels: {self.wheels} \n'
class AbstractCarBuilder: # 抽象建造者
def build_engine(self): pass
def build_wheels(self): pass
def get_car(self): pass
class SuvCarBuilder(AbstractCarBuilder): # 具体建造者
def __init__(self):
self.car = Car()
def build_engine(self):
self.car.engine = 'V6 turbo'
def build_wheels(self):
self.car.wheels = 'mikilin'
def get_car(self):
return self.car
class Director: # 指挥者
def construct(self, builder: AbstractCarBuilder):
builder.build_engine()
builder.build_wheels()
return builder.get_car()
# 使用示例
director = Director()
builder = SuvCarBuilder()
my_car = director.construct(builder)
print(my_car) # Engine: V6 turbo,Wheels: mikilin
应用场景
- 参数复杂的对象:当对象需要多个初始化参数
- 多形态的对象:当对象的表现形式有很多种
- 构造复杂但形式一致的对象:当对象的创建过程需要根据参数的不同而变化
优缺点
- 优点
- 封装性好,构建和表示分离
- 构建过程明确
- 符合单一职责原则
- 缺点
- 代码复杂,多类协同
- 创建过程复杂,需要控制流程
建造者模式 VS 工厂模式
对比点 | 建造者模式 | 工厂模式 |
---|---|---|
适用场景 | 对象内部构建复杂 | 不同类别对象,但流程一致 |
创建过程 | 创建过程复杂,需要控制 | 创建过程简单,不需要控制 |
扩展方向 | 扩展产品构造方式(纵向型) | 增加产品种类(横向型) |
总而言之,在使用上看处理的是多类型对象还是一个类型的复杂对象,如果是后者,使用工厂模式,如果是前者,使用建造者模式。