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

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

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

意图

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

适用性

在以下情况下使用 Builder 模式:

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

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

# 创建产品类
class Product:def __init__(self):self.part1 = Noneself.part2 = Nonedef __str__(self):return f"Part1: {self.part1}, Part2: {self.part2}"# 创建生成器接口
class Builder:def build_part1(self):passdef build_part2(self):passdef 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 += contentdef __str__(self):return f"<html>\n{self.content}\n</html>"# 创建生成器接口
class DocumentBuilder:def build_title(self, title):passdef build_paragraph(self, text):passdef build_list(self, items):passdef 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♪(・ω・)ノ 🍎

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

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

相关文章

FRC-EP系列--你的汽车数据一站式管家

FRC-EP系列产品主要面向汽车动力总成测试的客户&#xff0c;主要应用方向为残余总线仿真及网关。本文将详细介绍FRC-EP的产品特性和应用场景。 应用场景&#xff1a; 汽车电子生成研发过程中&#xff0c;需要对汽车各个控制器进行仿真测试&#xff0c;典型的测试对象有&#…

宝塔常见进程守护方法, 进程守护脚本

添加MySQL进程守护脚本方法 pgrep -x mysqld &> /dev/null if [ $? -ne 0 ];then bash /www/server/panel/script/rememory.sh /etc/init.d/mysqld start fi 添加Apache进程守护脚本方法 pgrep -x httpd &> /dev/null if [ $? -ne 0 ];then bash /www/server/…

数据中台之数据建模工程实操

目录 理论部分 工程实操 生成表结构 UI界面建表 DDL建表语句 ​编辑 Excel导入建表

把wpf的窗体保存为png图片

昨晚在stack overflow刷问题时看到有这个问题&#xff0c;今天早上刚好来尝试学习一下 stack overflow的链接如下&#xff1a; c# - How to render a WPF UserControl to a bitmap without creating a window - Stack Overflow 测试步骤如下&#xff1a; 1 新建.net frame…

VM17虚拟机设置网络,本地使用工具连接虚拟机

VM17虚拟机设置网络&#xff0c;本地使用工具连接虚拟机 下载及安装虚拟机不再说明&#xff0c;网络一堆教程。此处只对VM17设置网路及本地使用工具连接虚拟机操作&#xff0c;进行说明。 我下载的是VM17&#xff0c;网上有说VM16是较稳定的版本。想尝尝鲜&#xff0c;结果耗…

Flutter android和ios闪屏页配置

一.概念理解 闪屏页 1.当点击app开始的一瞬间&#xff0c;所呈现出来的页面就是闪屏页。 2.为什么会有闪屏也&#xff0c;由于app启动需要加载代码&#xff0c;这个过程需要耗时&#xff0c;在没有加载完成之前&#xff0c;是看不到app真正的页面。所以app在没有完全加载完时…

Yakit工具篇:WebFuzzer模块之序列操作

简介 Web Fuzzer 序列就是将多个 Web Fuzzer 节点串联起来&#xff0c;实现更复杂的逻辑与功能。例如我们需要先进行登录&#xff0c;然后再进行其他操作&#xff0c;这时候我们就可以使用 Web Fuzzer 序列功能。或者是我们在一次渗透测试中需要好几个步骤才能验证是否有漏洞这…

使用mod_rewrite时常用的服务器变量: RewriteRule规则表达式的说明:

使用mod_rewrite时常用的服务器变量&#xff1a; HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT connection & request: REMOTE_ADDR, QUERY_STRING server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL system stuff: TI…

vue中实现千位分隔符

vue中实现千位分隔符有两种&#xff0c;一种是某一个字段转换&#xff0c;一种是表格table中的整列字段转换 比如将3236634.12&#xff0c;经过转换后变为 3,236,634.12 1. 某一个字段转换 写js方法&#xff1a; export function numberExchange(value){if (!value) return…

高压放大器在铁电测试中的用途有哪些

高压放大器在铁电测试中有多种重要用途。铁电材料是指具有自发极化的晶体材料&#xff0c;具有一系列特殊的电学和物理性质。铁电测试是研究铁电材料性质的关键实验手段之一。下面安泰电子将介绍高压放大器在铁电测试中的几个主要用途。 极化场施加&#xff1a;铁电材料的最显著…

ARM---CAN2.0B读取 汽车BMS报文

Qt CAN编程1- CAN总线整体介绍 - 简书 STM32---CAN2.0B读取新能源汽车BMS报文-CSDN博客 CAN通信标准帧和扩展帧介绍_can扩展帧-CSDN博客 【精选】详解CAN 2.0协议_can2.0-CSDN博客 QT实现CAN通信_五个板栗的技术博客_51CTO博客 linux CAN通讯基于Qt代码编写_pf_can-CSDN博客…

【Mac开发环境搭建】安装HomeBrew、HomeBrew安装Docker、Docker安装Mysql5.7和8

文章目录 HomeBrew安装相关命令安装包卸载包查询可用的包更新所有包更新指定包查看已经安装的包查看包的信息清理包查看brew的版本更新brew获取brew的帮助信息 Brew安装DockerDocker常用命令镜像相关查看已经拉取的所有镜像删除镜像 容器相关停止运行容器启动容器重启容器删除容…

【第2章 Node.js基础】2.2 Node.js回调函数

学习目标 &#xff08;1&#xff09;理解Node.js的回调函数&#xff1b; &#xff08;2&#xff09;掌握回调函数的使用。 什么是回调函数 回调函数是一种特殊的函数&#xff0c;它作为参数传递给另一个函数&#xff0c;并在特定的事件或条件发生时被调用。回调函数通常用于异…

快手直播弹幕websocket protobuf序列化与反序列化

系列文章目录 websocket训练地址:https://www.qiulianmao.com,正在搭建中 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-python实现protobuf序列化与反序列化基础-前端js实现protobuf序列化与反序列化基础-protobufjs实现protobuf序列化与反…

一行命令让你的服务器命令行亮起来!!!!

if [ "$(whoami)" "root" ]; then echo "PS1${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# " >> /root/.bashrc; source /root/.bashrc; echo "已为root用户设置提示符以#结尾…

vue2 集成 - 超图 - SuperMap iClient3D for WebGL 及常用方法

文章目录 1:下载SuperMap iClient3D for WebGL2:格式化项目中所用的依赖包3:vue2 项目引入4:vue2 页面使用常见方法4.1 创建三维场景,引入在线地图资源,定位到指定位置4.2 坐标拾取4.3 用户输入事件4.4 拾取实体4.5 实体改变监听事件4.6 双击全屏4.7 相机移动事件4.8 添加…

kotlin 基本语法

const val INFO "ZZZ is Success Result" fun main(){ var name: String? "zzz" name null name?.capitalize() //?问号的意思是如果name是null ,后面的方法不执行&#xff0c;如果name不是null&#xff0c;后面方法执行 var name: String? &q…

内网可达网段探测netspy- Mac环境

netspy是一款快速探测内网可达网段工具 当我们进入内网后想要扩大战果&#xff0c;那我们可能首先想知道当前主机能通哪些内网段。 netspy正是一款应用而生的小工具&#xff0c;体积较小&#xff0c;速度极快&#xff0c;支持跨平台&#xff0c;支持多种协议探测&#xff0c;…

GNU ld链接器 lang_process()(二)

一、ldemul_create_output_section_statements() 位于lang_process()中11行 。 该函数用于创建与目标有关的输出段的语句。这些语句将用于描述输出段的属性和分配。 void ldemul_create_output_section_statements (void) {if (ld_emulation->create_output_section_sta…

Netty心跳检测

文章目录 一、网络连接假死现象二、服务器端的空闲检测三、客户端的心跳报文 客户端的心跳检测对于任何长连接的应用来说&#xff0c;都是一个非常基础的功能。要理解心跳的重要性&#xff0c;首先需要从网络连接假死的现象说起。 一、网络连接假死现象 什么是连接假死呢&…