Python设计模式-建造者模式(Builder)
建造者模式(Builder)
建造者模式适用于那些内容复杂多变,但是建造过程相同的对象。
目标:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
使用范围:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
和抽象工厂模式相比,抽象工厂着重于多个系列的产品对象,而建造者模式着重于按流程一步步创建一个复杂对象。
建造者模式的构成角色
- 产品:内容复杂,但是可以提取出公共组成部分的基类。建造的过程是实例化这些组成部分的过程。核心功能为定义对象结构
- 抽象建造者: 内容复杂,但是建造过程相同的对象,存在的公共的相同过程,可以抽象成一个基类,作为抽象建造者。核心功能为定义构造接口
- 具体建造者:对抽象建造者的具体化,是一系列具体的继承了抽象建造者的子类。
- 指挥者:根据抽象建造者的接口,调用建造者的类。实际使用中的输入为具体建造者。核心功能为定义流程
示例1
# 在这个例子中,存在显式的产品、抽象建造者、具体建造者和指挥者
class Building:
'''产品为建筑'''
def __init__(self, floor=None, size=None):
self.floor = floor
self.size = size
def __str__(self):
return f"floor = {self.floor}, size = {self.size}"
class AbstractBuilder:
'''抽象建造者,定义了建造过程的接口'''
def __init__(self):
self.building = Building()
def build_floor(self):
pass
def build_size(self):
pass
class House(AbstractBuilder):
'''具体建造者1'''
def build_floor(self):
self.building.floor = "one"
def build_size(self):
self.building.size = "big"
class Flat(AbstractBuilder):
'''具体建造者2'''
def build_floor(self):
self.building.floor = "more than one"
def build_size(self):
self.building.size = "small"
# 指挥者
class Director:
def create_building(self, builder):
builder = builder()
builder.build_floor()
builder.build_size()
return builder.building
# 调用过程
if __name__ == '__main__':
# 1. 创建具体建造者
builder = House()
# 2. 创建指挥者
director = Director()
# 3. 创建对象
my_building = director.create_building(builder)
示例2
# 在这个例子中,将产品和抽象建造者进行了合并。
# Abstract Building
class Building:
def __init__(self):
self.build_floor()
self.build_size()
def build_floor(self):
raise NotImplementedError
def build_size(self):
raise NotImplementedError
def __str__(self):
return f"floor = {self.floor}, size = {self.size}"
# Concrete Buildings
class House(Building):
def build_floor(self):
self.floor = "One"
def build_size(self):
self.size = "Big"
class Flat(Building):
def build_floor(self):
self.floor = "More than One"
def build_size(self):
self.size = "Small"
# 指挥者
class Director:
def create_building(self, builder):
building = builder()
building.build_floor()
building.build_size()
return building
# 调用过程
if __name__ == '__main__':
# 1. 创建具体建造者
builder = House()
# 2. 创建指挥者
director = Director()
# 3. 创建对象
my_building = director.create_building(builder)
示例3
# 在这个例子中,基于示例2,将指挥者进行了简化(以函数的形式替代类的形式)。
# Abstract Building
class Building:
def __init__(self):
self.build_floor()
self.build_size()
def build_floor(self):
raise NotImplementedError
def build_size(self):
raise NotImplementedError
def __str__(self):
return f"floor = {self.floor}, size = {self.size}"
# Concrete Buildings
class House(Building):
def build_floor(self):
self.floor = "One"
def build_size(self):
self.size = "Big"
class Flat(Building):
def build_floor(self):
self.floor = "More than One"
def build_size(self):
self.size = "Small"
# 指挥者
def create_building(builder):
building = builder()
building.build_floor()
building.build_size()
return building
# 调用过程
if __name__ == '__main__':
# 1. 创建具体建造者
builder = House()
# 2. 创建对象
my_building = create_building(builder)
ref
https://blog.csdn.net/weixin_51098806/article/details/123957639
本文来自博客园,作者:坦先生的AI资料室,转载请注明原文链接:https://www.cnblogs.com/yushengchn/p/16478419.html