迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

实现 Python Builder 模式的不同方法

作者:迹忆客 最近更新:2023/06/27 浏览次数:

构建器模式是一种允许对象的创建与其表示分离的模式。 这种模式可以创建和配置复杂的对象而无需继承,这是一种强大但不灵活的方法。

构建器模式还可用于在运行时提供类的不同实现,或允许用户无需访问源代码即可构造新对象。

本篇文章介绍构建器模式及其工作原理。 它还演示了实现 Python 构建器模式的不同方法。


构建器模式、它的重要性和工作原理

构建器模式是一种软件设计模式,允许逐步创建复杂对象的构造,从而提供新级别的细节或功能。

这种模式经常用于软件开发中,其中不同的软件组件必须组合起来才能形成一个完整的系统。

构建器模式可用于创建任何东西,从简单的对象(如桌子或椅子)到更复杂的系统(如计算机或飞机)。 对于创建需要按特定顺序创建的对象也很有帮助。

Python标准库提供了一个名为builder的模块,可以方便地使用Builder模式。 builder模块提供了两个类,Builder和Director,它们一起创建对象。

Builder类负责创建对象部件,Director类用于将组件组装成最终对象。

要使用 Builder 模式,首先创建一个 Builder 对象,用它来创建对象的各个部分。 然后创建一个 Director 对象,用它来将各个部分组装成最终对象。

最后,您可以调用 Director 对象的 build() 方法,该方法返回最终对象。


在 Python 中实现构建器模式的不同方法

Python 中实现 Builder 模式有两种方法:

  1. __init__ 方法
  2. __new__ 方法

使用 __init__ 方法

__init__ 方法是 Python 中实现构建器模式最常见的方法。 它在创建对象时被调用,允许您设置其属性的值。

使用 __new__ 方法

__new__ 方法不太常见,但功能更强大。 创建类时会调用 __new__ 方法,允许您创建对象本身。

这意味着您可以控制对象的创建方式,甚至可以创建与类不同类型的对象。


Python 中构建器模式的优点和缺点

下面列出了构建器模式的一些优点:

  • 构建器模式的基本优点是它允许逐步创建复杂的对象,提供新级别的细节或功能。
  • 这使得创建复杂对象变得更加简单和高效。
  • 构建器模式的另一个优点是它允许高度的灵活性,因为不同的构建器可以创建不同类型的对象。

使用构建器模式也有一些缺点。

  • 一是创建对象可能非常耗时,因为每个步骤都需要按顺序执行。
  • 另一个缺点是构建器模式可能非常复杂并且需要编写大量代码。

代码示例:

from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Any

class Builder(ABC):

    @property
    @abstractmethod
    def product(self) -> None:
        pass

    @abstractmethod
    def produce_a(self) -> None:
        pass
    """
    This class will provide specific working of the building steps by using the builder interface.
    """
class ConcreteBuilder1(Builder):

    def __init__(self) -> None:
            """ This fresh builder instance will contain a blank product object, which is
        used in further assembly.
        """
            self.reset()

    def reset(self) -> None:
        self._product = Product1()

    @property
    def product(self) -> Product1:

        product = self._product
        self.reset()
        return product

    def produce_a(self) -> None:
        self._product.add("PartA")

class Product1():
    """
    When your products are complex and demand extensive configuration, it's possible to use the Builder pattern only.
    """
    def __init__(self) -> None:
        self.parts = []

    def add(self, part: Any) -> None:
        self.parts.append(part)

    def list_parts(self) -> None:
        print(f"The Product parts: {', '.join(self.parts)}", end="")

class Director:
    """
   The client can control builders directly, so the Director class is
    optional. In this case, the Director is only responsible for executing the building steps in a specific sequence.
    """
    def __init__(self) -> None:
        self._builder = None

    @property
    def builder(self) -> Builder:
        return self._builder
        """
    The Director can construct several product variations using the same
    building steps.
    """

    @builder.setter
    def builder(self, builder: Builder) -> None:
        self._builder = builder

    def build_minimal_viable_product(self) -> None:
        self.builder.produce_a()

    def build_full_featured_product(self) -> None:
        self.builder.produce_a()

if __name__ == "__main__":

    director = Director()
    builder = ConcreteBuilder1()
    director.builder = builder

    print("Our Standard primary product:")
    director.build_minimal_viable_product()
    builder.product.list_parts()

    print("\n")

    print("Our Standard full-featured product:")
    director.build_full_featured_product()
    builder.product.list_parts()

    print("\n")
 # We can also use the Builder pattern without a Director class.
    print("Our Custom product: ")
    builder.produce_a()
    builder.product.list_parts()

输出:

Our Standard primary product:
The Product parts: PartA

Our Standard full-featured product:
The Product parts: PartA

Our Custom product: 
The Product parts: PartA

请记住,构建器模式也是一种设计模式,它通过分离构造和表示来帮助构建复杂的对象。 这种分离允许通过相同的构建过程进行不同的表示。

上一篇:Python 中的互相关

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中的互相关

发布时间:2023/06/27 浏览次数:81 分类:Python

互相关是一种重要的信号处理方法,用于分析具有不同滞后的两个信号之间的相似性。 您不仅可以了解两个信号的匹配程度,还可以获得它们最相似的时间点或索引。本文将讨论在 Python 中处理

使用 Python Timedelta 月份计算日期

发布时间:2023/06/27 浏览次数:128 分类:Python

在本篇文章中,我们将通过 timedelta 学习如何在 Python 中使用日期时间。 我们将了解如何计算当前日期或任何其他日期六个月后的日期。

Python MRO(方法解析顺序)

发布时间:2023/06/27 浏览次数:182 分类:Python

多重继承意味着单个子类可以继承多个类,并且子类将被授权访问属性和函数,除非它们不是该特定类的私有属性和函数。 MRO 技术用于搜索正在执行的类的顺序。在这篇文章中,我们将学习

Python 获取主目录

发布时间:2023/06/27 浏览次数:146 分类:Python

本篇文章将介绍使用 Python 中的 os.path.expanduser 或 pathlib 库获取主目录的路径。使用 Python 中的 os.path.expanduser 模块获取主目录

逐行分析 Python 代码

发布时间:2023/06/26 浏览次数:115 分类:Python

本文介绍了如何逐行分析 Python 代码并获取有关代码执行的有用信息。首先,我们简单介绍一下profiling; 然后,我们将讨论何时使用逐行分析比使用函数基础分析更好。

Python 中的 MIMEMultipart

发布时间:2023/06/26 浏览次数:186 分类:Python

在本文中,我们将了解如何在 Python 及其 MIME(多用途互联网邮件扩展)模块的帮助下发送带有附件的电子邮件的有效方法。Python 的 MIMEMultipart、MIMEText 和 MIMEBase 模块

Python 中的自动 ARIMA

发布时间:2023/06/26 浏览次数:127 分类:Python

在本文中,我们将了解 Python 中的 Auto ARIMA 及其工作原理。Python 中的自动 ARIMA pmdarima 库中的 auto_arima() 函数有助于确定 ARIMA 模型的最佳参数,并提供拟合的 ARIMA 模型作为结果。

Python 中的方差膨胀因子

发布时间:2023/06/26 浏览次数:93 分类:Python

本文介绍了方差膨胀因子 (VIF) 及其在检测有影响的观测值方面的性能,并演示了如何使用 statsmodels 在 Python 中使用 VIF。Python 中的方差膨胀因子

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便