Python 如何实践 Builder(生成器) 对象创建型设计模式?-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

开始之前我们先介绍一下该模型的基本信息。

生成器Builder设计模式是一种创建型设计模式它用于创建复杂对象将对象的构建过程与表示分离。这种分离可以让我们创建不同类型或配置的对象同时避免构造函数参数列表的爆炸性增长。

意图

将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示。

适用性

在以下情况下使用 Builder 模式

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

在 Python 中我们可以使用类和方法来实现生成器模式。以下是一个简单的示例演示如何在 Python 中实践生成器设计模式

# 创建产品类
class Product:
    def __init__(self):
        self.part1 = None
        self.part2 = None

    def __str__(self):
        return f"Part1: {self.part1}, Part2: {self.part2}"

# 创建生成器接口
class Builder:
    def build_part1(self):
        pass

    def build_part2(self):
        pass

    def get_product(self):
        pass

# 具体生成器实现
class ConcreteBuilder(Builder):
    def __init__(self):
        self.product = Product()

    def build_part1(self):
        self.product.part1 = "Part 1 built"

    def build_part2(self):
        self.product.part2 = "Part 2 built"

    def get_product(self):
        return self.product

# 创建导演类可选
class Director:
    def construct(self, builder):
        builder.build_part1()
        builder.build_part2()

# 客户端代码
if __name__ == "__main__":
    builder = ConcreteBuilder()  # 实例化具体生成器
    director = Director()  # 创建导演对象可选

    # 构建产品
    director.construct(builder)  # 如果没有导演也可以直接调用生成器的方法构建产品

    product = builder.get_product()  # 获取构建好的产品
    print(product)

在这个示例中我们首先定义了产品类 Product它有两个部分part1 和 part2。然后我们创建了生成器接口 Builder其中定义了创建产品的方法。接着我们实现了具体的生成器类 ConcreteBuilder它负责实际构建产品的各个部分。

最后我们可以使用导演类可选来协调生成器的构建步骤或者直接在客户端代码中使用生成器构建产品。生成器模式允许你以灵活的方式构建不同配置的产品同时保持构建过程的分离。这对于构建复杂对象或者具有多个可选部分的对象非常有用。

「导演类」通常就是指实现了导演模式的类通常被命名为 Director。导演类的主要职责是协调生成器的构建步骤指导生成器如何构建复杂对象以确保对象的正确组装。


当理解生成器设计模式时一个经典的示例是创建一个文档对象例如 HTML 文档其中包含多个部分例如标题、段落、列表等。
以下是一个更具体的示例演示如何使用生成器模式创建一个简单的 HTML 文档

# 创建产品类
class HTMLDocument:
    def __init__(self):
        self.content = ""

    def add_content(self, content):
        self.content += content

    def __str__(self):
        return f"<html>\n{self.content}\n</html>"

# 创建生成器接口
class DocumentBuilder:
    def build_title(self, title):
        pass

    def build_paragraph(self, text):
        pass

    def build_list(self, items):
        pass

    def get_document(self):
        pass

# 具体生成器实现
class HTMLDocumentBuilder(DocumentBuilder):
    def __init__(self):
        self.document = HTMLDocument()

    def build_title(self, title):
        self.document.add_content(f"<head><title>{title}</title></head>")

    def build_paragraph(self, text):
        self.document.add_content(f"<p>{text}</p>")

    def build_list(self, items):
        item_list = "\n".join([f"<li>{item}</li>" for item in items])
        self.document.add_content(f"<ul>\n{item_list}\n</ul>")

    def get_document(self):
        return self.document

# 客户端代码
if __name__ == "__main__":
    builder = HTMLDocumentBuilder()

    builder.build_title("Sample HTML Document")
    builder.build_paragraph("This is a sample HTML document.")
    builder.build_list(["Item 1", "Item 2", "Item 3"])

    document = builder.get_document()
    print(document)

在这个示例中我们定义了产品类 HTMLDocument具有一个字符串内容字段。生成器接口 DocumentBuilder 声明了创建 HTML 文档的方法。然后我们实现了具体的生成器类 HTMLDocumentBuilder它负责构建 HTML 文档的各个部分。

客户端代码使用生成器来构建 HTML 文档。首先它创建了一个生成器对象然后使用生成器的方法逐步构建标题、段落和列表。最后通过调用 get_document 方法获取构建好的 HTML 文档对象并打印出来。

这个示例演示了如何使用生成器模式创建一个复杂的对象而不必担心对象的内部构建细节同时也允许你以不同的方式构建不同类型的 HTML 文档。这有助于将构建过程和产品的表示分离开来。


好了这次就介绍到这里吧喜欢的小伙伴们别忘了点赞、收藏~ Thanks♪(ω)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python