首页 > 编程语言 >Clean code: Python Builder模式

Clean code: Python Builder模式

时间:2024-09-13 22:03:08浏览次数:9  
标签:code Python car Builder set 构建 seats self

在 Python 中,Builder 模式(构建者模式)是一种创建型设计模式,通常用于构建复杂对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的对象。虽然 Python 语言由于其动态特性,不像 Java、C# 等语言那样强制使用 Builder 模式,但它在某些情况下仍然非常有用,尤其是当你需要构建具有多个可选参数的复杂对象时。

以下是一个简单的 Builder 模式在 Python 中的例子:

示例:构建一辆汽车的 Builder

我们将通过 Builder 模式来构建一辆汽车(Car),汽车有一些可选的特性,比如引擎类型、颜色、座椅类型等。

class Car:
    def __init__(self):
        self.engine = None
        self.wheels = None
        self.color = None
        self.seats = None

    def __str__(self):
        return f"Car with {self.engine} engine, {self.wheels} wheels, {self.color} color, {self.seats} seats."


class CarBuilder:
    def __init__(self):
        self.car = Car()

    def set_engine(self, engine_type):
        self.car.engine = engine_type
        return self  # 返回 builder 自身以便支持链式调用

    def set_wheels(self, wheels_count):
        self.car.wheels = wheels_count
        return self

    def set_color(self, color):
        self.car.color = color
        return self

    def set_seats(self, seats_count):
        self.car.seats = seats_count
        return self

    def build(self):
        return self.car


# 客户端代码
builder = CarBuilder()
car = (builder.set_engine("V8")
       .set_wheels(4)
       .set_color("Red")
       .set_seats(2)
       .build())

print(car)  # 输出: Car with V8 engine, 4 wheels, Red color, 2 seats.

解释

  1. Car 类:代表最终构建的对象。它有多个属性,如引擎、车轮、颜色和座椅等。
  2. CarBuilder 类:这是构建者类,负责设置不同的属性并最终返回构建好的 Car 对象。每个设置方法都会返回自身,以支持链式调用。
  3. 链式调用CarBuilder 的每个设置方法返回 self,这样用户可以在一次调用中设置多个属性,而不需要每次重新调用 CarBuilder 的实例。
  4. build() 方法:当所有需要的属性都设置完成后,调用 build() 方法返回最终构建好的对象。

示例:更复杂的 Director 角色

在更复杂的场景中,可以使用 Director 类,它负责调用 Builder 的构建步骤,决定如何去构建对象。

class CarDirector:
    def __init__(self, builder):
        self._builder = builder

    def construct_sports_car(self):
        return (self._builder
                .set_engine("V8")
                .set_wheels(4)
                .set_color("Red")
                .set_seats(2)
                .build())

    def construct_family_car(self):
        return (self._builder
                .set_engine("V6")
                .set_wheels(4)
                .set_color("Blue")
                .set_seats(5)
                .build())


# 客户端代码
builder = CarBuilder()
director = CarDirector(builder)

sports_car = director.construct_sports_car()
family_car = director.construct_family_car()

print(sports_car)  # 输出: Car with V8 engine, 4 wheels, Red color, 2 seats.
print(family_car)  # 输出: Car with V6 engine, 4 wheels, Blue color, 5 seats.

解释

  • Director 类:它负责控制构建的流程。它通过调用 Builder 类中的方法来构建不同类型的对象(如运动型汽车、家庭汽车等)。Director 不需要知道具体如何构建对象,只需要知道哪些步骤需要调用。
  • Builder 和 Director 分离:通过将构建的过程与具体的对象表示分离,我们可以灵活地更改构建逻辑,而不影响客户端代码。同时,Director 提供了不同的构建方案,如构建运动型汽车和家庭汽车。

什么时候使用 Builder 模式?

  • 当一个对象有许多可选参数或复杂的构建步骤时,使用 Builder 模式可以避免构造函数中的大量参数。
  • 当你希望代码更具可读性时,链式调用的方式能让构建过程更直观。
  • 如果同一个构建过程可以生成不同的产品,那么 Builder 模式非常适用。

总结

在 Python 中使用 Builder 模式虽然不像在 Java 或 C++ 中那样普遍,但它在处理复杂对象构建时仍然非常有用。通过使用 Builder 模式,你可以更加优雅、灵活地创建复杂对象,尤其是当对象具有多种可选配置时。

标签:code,Python,car,Builder,set,构建,seats,self
From: https://www.cnblogs.com/math/p/18412971/py-builder-pattern

相关文章

  • python logging 限制文件大小
    环境window10,pycharm23.0.2logging的配置使用logging模块时,你可以通过logging.handlers.RotatingFileHandler类来限制日志文件的大小。当日志文件达到指定大小时,RotatingFileHandler会自动创建一个新的日志文件,并将后续的日志记录到新的文件中。代码importloggingfro......
  • Python XML 解析
    什么是XML?Python对XML的解析1.SAX(simpleAPIforXML)2.DOM(DocumentObjectModel)3.ElementTree(元素树)python使用SAX解析xmlContentHandler类方法介绍make_parser方法parser方法parseString方法Python解析XML实例使用xml.dom解析xml什么是XML?XML......
  • Python 多线程
    开始学习Python线程线程模块使用Threading模块创建线程线程同步线程优先级队列(Queue)多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事......
  • Python SMTP发送邮件
    使用Python发送HTML格式的邮件Python发送带附件的邮件在HTML文本中添加图片使用第三方SMTP服务发送SMTP(SimpleMailTransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方......
  • Hash Table 哈希表工作原理介绍及C/C++/Python实现
    HashTable哈希表工作原理介绍及C/C++/Python实现哈希表(HashTable),也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置以便快速访问记录的数据结构。它提供了非常高效的数据检索、插入和删除操作。哈希表的基本原理是使用一个哈希函数将输入(通常是字符串)转换为一个......
  • YOLO【避免重复造轮子】开发中积累的一些数据集处理python脚本分享!!
    YOLO【避免重复造轮子】开发中积累的一些数据集处理python脚本分享!!预览内容YOLO【避免重复造轮子】开发中积累的一些数据集处理python脚本分享!!前言代码分享1、坐标转换2、读取标签文件3、cv2快速读取和保存中文路径图片4、单独绘制检测框BBOX和实例分割MASK5、数据集分......
  • opencv-python学习笔记9-图像分割
    目录一、图像分割的概述、技术现状、应用:技术现状:传统图像分割技术:深度学习驱动的图像分割技术:应用领域:二、 图像分割的方法和分类:(1)基于阈值的分割方法:(2)基于区域的分割方法:(3)基于边缘的分割方法:(4)基于特定理论的分割方法:(5)基于深度学习的分割方法:三、图像分割的原理:......
  • 基于python+flask框架的进销存管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的扩大与市场竞争的加剧,传统的手工管理模式已难以满足现代商业对效率与准确性的高要求。进销存管理系统作为企业管理的重要组......
  • 基于python+flask框架的资产评估系统的设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着市场经济的快速发展与全球化进程的加速,资产评估作为连接经济交易、投资决策、财务管理的重要环节,其重要性日益凸显。传统的手工评估方......
  • 基于python+flask框架的教师档案管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育事业的蓬勃发展,教师作为教育体系的核心资源,其管理效率与质量直接关系到学校的教学水平和长远发展。传统的手工或简单的电子表格管......