Python编码系列—Python建造者模式:构建复杂对象的优雅之道

news2024/9/20 8:42:54

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 原理
    • 2.1 **定义产品接口**:
    • 2.2 **创建具体产品类**:
    • 2.3 **定义建造者接口**:
    • 2.4 **创建具体建造者类**:
    • 2.5 **客户端独立使用建造者**:
  • 3. 使用场景
  • 4. 代码样例
  • 5. 实际应用案例
  • 6. 总结

1. 背景介绍

在软件开发中,我们经常需要创建一些复杂的对象,这些对象的构建过程可能涉及多个步骤,并且这些步骤可能会根据具体的情况有所变化。建造者模式(Builder Pattern)提供了一种解决方案,它能够让你分步骤创建复杂对象,并允许你只通过必要的步骤来构建对象,从而使得代码更加灵活和可维护。本文将深入探讨Python中的建造者模式,包括其背景、原理、使用场景、代码实现和实际应用案例。

建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式非常适合用于创建那些需要多步骤构建,或者构建过程可能会变化的对象。
在这里插入图片描述

2. 原理

建造者模式的核心原理包括:

  • 定义产品接口:定义一个产品接口,该接口声明了产品的各个组成部分。
  • 创建具体产品类:实现产品接口的具体类,这些类定义了产品的具体属性和行为。
  • 定义建造者接口:定义一个建造者接口,该接口声明了创建产品各个组成部分的方法。
  • 创建具体建造者类:实现建造者接口的具体类,这些类实现了创建产品各个组成部分的具体逻辑。
  • 客户端独立使用建造者:客户端通过建造者接口来创建产品,无需关心产品的具体构建细节。

建造者模式是一种专门用来构建复杂对象的设计模式,它能够让你分步骤创建复杂对象,并允许你只通过必要的步骤来构建对象。这种模式在处理那些由多个部分组成的对象时特别有用,尤其是当这些部分可能会根据不同的需求进行不同的组合时。下面我们详细探讨建造者模式的核心原理:

2.1 定义产品接口

产品接口是建造者模式中定义最终要构建的对象的接口。这个接口通常包含了一系列设置产品各个组成部分的方法,以及一个用于获取最终产品实例的方法。这样的设计允许客户端在不知道具体产品细节的情况下,通过接口与产品进行交互。

class Product:
    def part_a(self):
        pass
    def part_b(self):
        pass
    def assemble(self):
        pass

在这个例子中,Product类定义了产品的组成部分和组装方法。

2.2 创建具体产品类

具体产品类实现了产品接口,并提供了构建和组装产品的具体实现。这个类通常包含了产品所需的所有属性和行为,以及将这些部分组合成最终产品的逻辑。

class ConcreteProduct(Product):
    def part_a(self):
        print("Part A is added.")
    def part_b(self):
        print("Part B is added.")
    def assemble(self):
        print("Product is assembled.")

ConcreteProduct类提供了part_apart_bassemble方法的具体实现。

2.3 定义建造者接口

建造者接口定义了一系列用于构建产品的方法,这些方法通常对应于产品的不同部分。建造者接口允许不同的建造者以不同的方式构建产品,而客户端则不需要关心这些细节。

class Builder:
    def build_part_a(self):
        pass
    def build_part_b(self):
        pass

Builder接口定义了build_part_abuild_part_b方法,这些方法将由具体建造者实现。

2.4 创建具体建造者类

具体建造者类实现了建造者接口,并提供了构建产品各个部分的具体逻辑。每个具体建造者都与一个具体产品类相对应,它负责创建和组装该产品的所有部分。

class ConcreteBuilder(Builder):
    def __init__(self):
        self.product = ConcreteProduct()
    
    def build_part_a(self):
        self.product.part_a()
    
    def build_part_b(self):
        self.product.part_b()
    
    def get_result(self):
        self.product.assemble()
        return self.product

ConcreteBuilder类实现了Builder接口,并提供了构建ConcreteProduct对象的方法。

2.5 客户端独立使用建造者

客户端代码通过建造者接口与具体建造者交互,从而创建所需的产品。客户端不需要直接与产品类交互,也不需要知道产品是如何被构建和组装的。这种解耦使得系统更加灵活,并且当产品构建逻辑变化时,客户端代码可以保持不变。

def client_code(builder: Builder):
    builder.build_part_a()
    builder.build_part_b()
    product = builder.get_result()
    product.show()

builder = ConcreteBuilder()
client_code(builder)

在这个例子中,client_code函数接受一个Builder类型的参数,并使用它来构建产品。客户端通过调用建造者的方法来构建产品,并最终获取构建好的产品实例。

通过这些核心原理,建造者模式提供了一种清晰的方式来构建复杂对象,同时保持了代码的灵活性和可维护性。

3. 使用场景

建造者模式适用于以下场景:

  • 对象构建过程复杂:当创建的对象包含多个属性,且构建过程复杂时。
  • 对象构建过程可能会变化:当对象的构建过程可能会根据具体需求变化时。
  • 需要创建不可变对象:当需要创建一旦构建完成就不可修改的对象时。

4. 代码样例

以下是一个Python中实现建造者模式的示例:

from abc import ABC, abstractmethod

# 产品接口
class Product(ABC):
    @abstractmethod
    def show(self):
        pass

# 具体产品
class ConcreteProduct(Product):
    def __init__(self):
        self._parts = []

    def add(self, part):
        self._parts.append(part)

    def show(self):
        print("Product parts:", self._parts)

# 建造者接口
class Builder(ABC):
    @abstractmethod
    def build_part_a(self):
        pass

    @abstractmethod
    def build_part_b(self):
        pass

    def get_result(self):
        pass

# 具体建造者
class ConcreteBuilder(Builder):
    def __init__(self):
        self._product = ConcreteProduct()

    def build_part_a(self):
        print("Building part A")
        self._product.add("PartA")

    def build_part_b(self):
        print("Building part B")
        self._product.add("PartB")

    def get_result(self):
        return self._product

# 客户端代码
def client_code(builder: Builder):
    builder.build_part_a()
    builder.build_part_b()
    product = builder.get_result()
    product.show()

builder = ConcreteBuilder()
client_code(builder)

5. 实际应用案例

假设我们正在开发一个汽车配置系统,需要根据不同的配置选项构建不同的汽车。我们可以使用建造者模式来实现这一需求。

# 产品:汽车
class Car(Product):
    def __init__(self):
        self._parts = []

    def add(self, part):
        self._parts.append(part)

    def show(self):
        print("Car parts:", self._parts)

# 建造者:汽车建造者
class CarBuilder(Builder):
    def __init__(self):
        self._car = Car()

    def build_engine(self):
        print("Building engine")
        self._car.add("Engine")

    def build_wheels(self, count):
        print(f"Building {count} wheels")
        for _ in range(count):
            self._car.add("Wheel")

    def get_result(self):
        return self._car

# 客户端代码
def build_car(builder: Builder):
    builder.build_engine()
    builder.build_wheels(4)
    car = builder.get_result()
    car.show()

builder = CarBuilder()
build_car(builder)

6. 总结

建造者模式是一种非常实用的设计模式,它通过将对象的构建过程与表示分离,使得对象的构建过程更加灵活和可维护。在实际开发中,可以根据具体需求选择合适的建造者模式实现方式,以满足不同的业务需求。

设计模式是软件设计中的艺术,建造者模式作为其中的一种,为我们提供了一种优雅的方式来构建复杂对象。希望本文能够帮助你在Python项目中更好地应用建造者模式,提升代码的质量和效率。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring-cloud-gateway报错问题总结

1. 访问接口出现 There was an unexpected error (typeService Unavailable, status503).Unable to find instance for order 假设我们有服务 spring-appication-name: order 但命名路由id 也为order 就会出现这类错误 因为 gateway 有默认路由

Mysql | 知识 | 理解是怎么加锁的

文章目录 一、怎么加行级锁的?二、唯一索引加锁2.1 唯一索引等值查询1、记录存在的情况2、记录不存在的情况 2.2 唯一索引范围查询a. 针对「大于」的范围查询b. 针对「大于等于」的范围查询的情况。c. 「小于」范围查询,记录「不存在」表中的情况d. 「小…

JMeter压力测试

下载地址 第一步:修改配置,并启动软件 进入bin目录,修改jmeter.properties文件中的语言支持为language=zh_CN,然后点击jmeter.bat 启动软件。 第二步:添加线程组 第三步:添加Http取样

STL之Vector容器

容器 容器的分类 序列式容器(Sequence containers) - 每个元素都有固定位置--取决于插入时机和地点和元素值无关 - vector、deque、list、stack、queue 关联式容器(Associated containers) - 元素位置取决于特定的排序准则,和插入顺序无关 - set、multiset、ma…

ARADEX伺服驱动器电源维修G565 D565/60 M5ref

伺服驱动器维修常见故障:无显示、缺相、过流、过压、欠压、过热、过载、接地、参数错误、有显示无输出、模块损坏。我们本着诚信待人的宗旨,凭借娴熟的技术和丰富的维修经验,为国内外诸多企业修了各种不同的伺服电机、驱动器和电源。 短路保…

SpringBoot - 广场舞团

专业团队,咨询就送开题报告,欢迎留言私信 摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各…

Web 安全基础教程:从零基础入门到精通

一、Web 安全概述 (一)Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁,确保 Web 服务的保密性、完整性和可用性。在当今数字化时代,Web 应用广泛存在于各个领域,从电子商务到社交媒…

Vue2 qrcode+html2canvas 实现二维码的生成和保存

1.安装 npm install qrcode npm install html2canvas 2.引用 import QRCode from qrcode import html2canvas from html2canvas 效果&#xff1a; 1. 二维码生成&#xff1a; 下载二维码图片&#xff1a; 二维码的内容&#xff1a; 实现代码&#xff1a; <template>…

Linux进程优先级

&#x1f4dd;目录 &#x1f31f; 查看进程信息&#x1f31f; PRI and NI 风过无痕 忘川如斯 如日方升 策引千问 &#x1f31f; 查看进程信息 ps -l命令 UID : 代表执行者的身份PID : 代表这个进程的代号PPID &#xff1a;代表这个进程是由哪个进程发展衍生而来的&#xff0c…

二维码模组扫码器C#实现串口自动监听功能

C# Demo&#xff0c;调用二维码模块的tx_windows_hidpos.dll扫码库&#xff0c;支持QR-M20 、QR-M10、QR-M30等二维码型号。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text; using…

超级好用的化妆神器,一键迁移妆容,觉得别人化妆真好看,看我一键迁移到自己的脸上!(附工作流)

这两天开源社区又出了一个比较有趣的ComfyUI 插件&#xff0c;功能很简单&#xff0c;可以实现妆容的一键迁移。 操作也很简单&#xff0c;只需要上传一张带有妆容的人物照片&#xff0c;再上传一张想要迁移妆容的照片&#xff0c;就可以把参考人物的妆容迁移到想要迁移的人物…

深入分析计算机网络性能指标

速率带宽吞吐量时延时延带宽积往返时间RTT利用率丢包率图书推荐内容简介作者简介 速率 连接在计算机网络上的主机在数字信道上传送比特的速率&#xff0c;也称为比特率或数据率。 基本单位&#xff1a;bit/s&#xff08;b/s、bps&#xff09; 常用单位&#xff1a;kb/s&#x…

大模型能否真正理解上下文?

人工智能咨询培训老师叶梓 转载标明出处 尽管对LLMs的评估涵盖了自然语言处理&#xff08;NLP&#xff09;的各个领域&#xff0c;但对它们理解上下文特征的语言能力的探讨却相对有限。为了填补这一空白&#xff0c;乔治城大学和苹果公司的研究者们共同提出了一种新的上下文理解…

HW行动指南,前辈教你如何真正靠护网赚到钱!

‍正文&#xff1a; HW行动&#xff0c;攻击方的专业性越来越高&#xff0c;ATT&CK攻击手段覆盖率也越来越高&#xff0c;这对于防守方提出了更高的要求&#xff0c;HW行动对甲方是一个双刃剑&#xff0c;既极大地推动了公司的信息安全重视度和投入力量&#xff0c;但同时…

【目标检测数据集】水泥搅拌车数据集2165张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2165 标注数量(xml文件个数)&#xff1a;2165 标注数量(txt文件个数)&#xff1a;2165 标注…

【LeetCode】每日一题 2024_9_14 从字符串中移除星号(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 今天的题目曾经的我做过了 . . . 又是复习的一天 题目&#xff1a;从字符串中移除星号 代码与解题思路 func removeStars(s string) string {// 本题的核心&#xff1a;生成的输入保证总是可以执行题面中…

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法 现象解决办法 现象 在命令行中&#xff0c;可以正常导入_ssl模块&#xff0c;如下&#xff1a; Python 3.9.0 (default, Nov 15 2020, 08:30:55) [MSC v.1916 64 bit (AMD64)] :: Anaconda, …

【Qt | QLineEdit】Qt 中使 QLineEdit 响应 鼠标单击、双击事件 的两个方法

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-09-14 …

做外贸为什么要做谷歌seo?

跟国内不同&#xff0c;购物有多个大平台可供选择&#xff0c;在海外是有很多人会在谷歌搜索上寻找自己想要的产品或者服务的&#xff0c;海外谷歌那是真正的老大哥&#xff0c;你想要的都能搜到&#xff0c;而谷歌的流量以及准确性&#xff0c;都不是国内以及购物平台可以比拟…

Vue组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能&#xff0c;它是一组附加的、基于函数的 API&#xff0c;可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此&#xff0c;使用组合式 API 可以将组件代码编写为多个函…