Python设计模式-建造者模式(Builder)

建造者模式(Builder)

建造者模式适用于那些内容复杂多变,但是建造过程相同的对象。

目标:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

使用范围:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

和抽象工厂模式相比,抽象工厂着重于多个系列的产品对象,而建造者模式着重于按流程一步步创建一个复杂对象。

返回 Python设计模式-outline

建造者模式的构成角色

  1. 产品:内容复杂,但是可以提取出公共组成部分的基类。建造的过程是实例化这些组成部分的过程。核心功能为定义对象结构
  2. 抽象建造者: 内容复杂,但是建造过程相同的对象,存在的公共的相同过程,可以抽象成一个基类,作为抽象建造者。核心功能为定义构造接口
  3. 具体建造者:对抽象建造者的具体化,是一系列具体的继承了抽象建造者的子类。
  4. 指挥者:根据抽象建造者的接口,调用建造者的类。实际使用中的输入为具体建造者。核心功能为定义流程

示例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

https://zhuanlan.zhihu.com/p/438520255

posted @ 2022-07-14 16:59  坦先生的AI资料室  阅读(418)  评论(0编辑  收藏  举报