当前位置: 首页 > news >正文

【python设计模式】4、建造者模式

哲学思想:

建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤,并将这些步骤分别封装在一个独立的建造者类中。然后,我们可以使用一个指挥者类来控制建造者的调用顺序,以便在每个步骤完成后正确地构建复杂对象。

建造者模式的另一个哲学思想是,将对象的构建与其表示分离开来。这意味着我们可以使用相同的构建过程来创建不同的表示形式,而不必改变建造者的代码。例如,我们可以使用相同的建造者类来创建不同的文本编辑器,如 Word、Notepad 和 Sublime Text。

通过将对象的创建过程分解成多个简单的步骤,我们可以更好地控制对象的创建过程,并且可以将其组合方式变得更加灵活。同时,建造者模式也可以帮助我们隐藏对象的创建过程,从而提高代码的可维护性和可扩展性。例如,在需要添加新的建造者或修改某个建造者时,我们只需要修改指挥者类或建造者类,而不必改变客户端的代码。

总之,建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤,并将其组合方式变得更加灵活,同时将对象的构建与其表示分离开来,以提高代码的可维护性和可扩展性。

简介:

建造者模式是一种创建型设计模式,它允许您逐步构造复杂对象。与直接实例化复杂对象不同,建造者模式将对象的构造过程分解为一系列步骤,使您可以逐个处理这些步骤。

建造者模式的核心思想是将一个复杂对象的构造过程和它的表示分离开来,使得同样的构造过程可以创建不同的表示。通常情况下,一个建造者模式包括以下四个角色:

  • Product(产品):表示被建造的复杂对象,包含多个部件。
  • Builder(抽象建造者):定义构造过程的接口,包括创建各个部件的抽象方法。
  • ConcreteBuilder(具体建造者):实现 Builder 接口,构造和装配各个部件,同时提供一个返回产品的方法。
  • Director(指挥者):负责安排各个部件的构造顺序,告诉 Builder 需要创建哪些部件,以及如何组装它们。

建造者模式可以使得代码更加灵活和可扩展,因为它将对象构造过程的细节隐藏了起来,客户端只需要指定需要建造的对象类型和相关参数,而无需了解其构造细节。此外,建造者模式也使得对象的构造过程更加模块化,有助于代码的维护和复用。

建造者模式常用于创建复杂的对象,例如,文本编辑器、电子表格程序和图形用户界面。

优点:

  1. 将复杂对象的构造过程和表示分离。这使得客户端可以更加简单地创建对象,同时也使得代码更加灵活和易于维护。

  2. 可以使用相同的构造过程来创建不同的对象表示。因为建造者模式将构造过程和表示分离,所以您可以使用相同的构造过程来创建不同的对象表示。这样可以大大减少代码的重复,并且使得对象表示更加易于扩展。

  3. 支持逐步构建复杂对象。建造者模式允许您逐步构建复杂对象,因为您可以分解对象构造过程为一系列简单的步骤,并逐步完成每个步骤。这样可以使得构造过程更加可控,同时也有助于代码的维护和测试。

  4. 代码结构清晰。建造者模式的代码结构清晰,并且易于理解和扩展。因为建造者模式将构造过程分解为一系列步骤,并将其封装在不同的类中,所以可以更加清晰地组织代码。

缺点

  1. 建造者模式的实现较为复杂。由于建造者模式将对象的构造过程分解为多个步骤,所以需要创建多个类来实现建造者模式。这会增加代码量和复杂度,使得代码变得更难理解和维护。

  2. 建造者模式要求建造者类必须知道产品的内部结构。由于建造者类需要创建产品的各个部分并组装它们,所以必须了解产品的内部结构。这种紧密耦合的设计使得建造者模式的扩展性和灵活性变得较差。

  3. 建造者模式不适用于创建简单的对象。由于建造者模式将对象构造过程分解为多个步骤,所以如果要创建简单的对象,建造者模式会增加代码的复杂度,使得代码变得更加冗长和难以理解。

  4. 建造者模式可能会导致对象数量增加。由于建造者模式创建的对象是由多个部件组成的,所以可能会导致对象的数量增加,从而占用更多的内存空间。

应用实例:

  1. 游戏开发:游戏中的角色、道具、装备等都是由多个部分组成的,使用建造者模式可以方便地组装各个部分,并创建出一个完整的游戏对象。

  2. 操作系统内核开发:操作系统内核中的进程、线程等都是由多个部分组成的,使用建造者模式可以方便地创建出一个完整的进程或线程对象。

  3. 汽车制造业:汽车是由多个部件组成的,使用建造者模式可以方便地组装各个部件,并创建出一个完整的汽车对象。

  4. 大型网站开发:大型网站通常包含多个模块,例如用户管理、订单管理、商品管理等,使用建造者模式可以方便地创建出一个完整的网站对象。

示例代码

class Product:def __init__(self):self.part_a = Noneself.part_b = Noneself.part_c = Noneclass Builder:def __init__(self):self.product = Product()def build_part_a(self):passdef build_part_b(self):passdef build_part_c(self):passclass ConcreteBuilder1(Builder):def build_part_a(self):self.product.part_a = "Part A1"def build_part_b(self):self.product.part_b = "Part B1"def build_part_c(self):self.product.part_c = "Part C1"class ConcreteBuilder2(Builder):def build_part_a(self):self.product.part_a = "Part A2"def build_part_b(self):self.product.part_b = "Part B2"def build_part_c(self):self.product.part_c = "Part C2"class Director:def __init__(self, builder):self.builder = builderdef construct(self):self.builder.build_part_a()self.builder.build_part_b()self.builder.build_part_c()return self.builder.product# Usage example
builder1 = ConcreteBuilder1()
director = Director(builder1)
product1 = director.construct()
print(product1.part_a)  # Output: Part A1
print(product1.part_b)  # Output: Part B1
print(product1.part_c)  # Output: Part C1builder2 = ConcreteBuilder2()
director = Director(builder2)
product2 = director.construct()
print(product2.part_a)  # Output: Part A2
print(product2.part_b)  # Output: Part B2
print(product2.part_c)  # Output: Part C2

在这个示例中,我们定义了一个 Product 类作为建造者模式中要创建的产品类。然后,我们定义了一个 Builder 基类和两个具体建造者类 ConcreteBuilder1ConcreteBuilder2,它们都继承自 Builder 基类,并实现了不同的构建方法。

最后,我们定义了一个 Director 类,它接受一个建造者对象并使用它的构建方法来构建产品。在这个示例中,我们创建了两个不同的建造者对象,并使用它们分别构建了两个不同的产品。

相关文章:

【python设计模式】4、建造者模式

哲学思想: 建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤,并将这些步骤分别封装在一个独立的建造者类中。然后,我们可以使用一个指挥者类来控制建造者的调用顺序,以便在每个步骤完成后正确地构建复杂对象。 …...

【全网独家】华为OD机试Golang解题 - 机智的外卖员

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 如果想要在华为od机试中获取高分…...

Sentinel滑动时间窗限流算法原理及源码解析(中)

文章目录 MetricBucketMetricEvent数据统计的维度WindowWrap样本窗口实例 范型T为MetricBucket windowLengthInMs 样本窗口长度 windowStart 样本窗口的起始时间戳 value 当前样本窗口的统计数据 其类型为MetricBucket MetricBucket MetricEvent数据统计的维度 1、首先计算27t位…...

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务准备工作 需要安装好nodejs,nodejs下载地址,下载对应的版本向导式安装即可。 安装完成后,控制台输入node -v&a…...

linux 命名管道 mkfifo

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.目录 前言 概述 原理介绍 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编程…...

Redis(主从复制、哨兵模式、集群)概述及部署

目录 1.redis高可用 2.redis持久化 1.Redis 提供两种方式进行持久化: 2.RDB 持久化 3.AOF持久化 4.RDB和AOF的优缺点 5.Redis 性能管理 3.redis主从复制 1.Redis主从复制的概念 2.Redis主从复制的作用 3.Redis主从复制的搭建 4.redis哨兵模式 1.哨兵模式…...

windows下软件包安装工具之Scoop安装与使用

Scoop介绍 Scoop是Windows的命令行程序安装器。 Scoop从命令行安装程序,及其容易。它有如下特点: 消除权限弹出窗口隐藏 GUI 向导样式的安装程序防止安装大量程序的 PATH 污染避免安装和卸载程序的意外副作用自动查找并安装依赖项自行执行所有额外的设…...

九龙证券|人工智能+国产软件+智慧城市概念股火了,欧洲资管巨头大举抄底

近一周组织调研个股数量有130多只,迈瑞医疗成为调研组织数量最多的股票。 证券时报数据宝统计,近一周组织调研公司数量有130多家。从调研组织类型来看,证券公司调研相对最广泛,调研80多家公司。 迈瑞医疗获超500家组织调研 迈瑞…...

Nacos下载安装与配置(windows)

一、Nacos下载 官网地址:home (nacos.io) 点击前往Github,跳转至Github下载页面。 点击Tags,跳转至版本选择页面,此处选择2.2.0版本。 点击nacos-server-2.2.0.zip,进行下载。 二、Nacos安装 将下载的压缩包解压至需…...

QT学习笔记(语音识别项目 )

语音识别项目 我们知道 AI 智能音箱已经在我们生活中不少见,也许我们都玩过,智能化非常高,功能 强大,与我们平常玩的那种蓝牙音箱,Wifi 音箱有很大的区别,AI 智能在哪里呢?语音识别技 术和云端…...

Vulnhub:DC-4靶机

kali:192.168.111.111 靶机:192.168.111.251 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.251 访问目标网站发现需要登录 使用账号admin爆破出密码:happy 登陆后抓包执行反弹shell 提权 在/home/jim/backu…...

序列差分练习题--从模板到灵活运用

本篇包含6道序列差分练习题及题解,难度由模板到提高 语文成绩 题目背景 语文考试结束了,成绩还是一如既往地有问题。 题目描述 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分…...

Xshell 连接 Ubuntu 20.04

1 更改网络配置信息 修改/etc/netplan/01-network-manager-all.yaml文件信息 sudo gedit /etc/netplan/01-network-manager-all.yaml删除原有内容,替换为以下信息: 注意:addresses、gateway4 要根据个人虚拟机的实际情况修改 # Let Networ…...

【网口交换机:交换机KSZ9897学习-笔记-资料汇总-记录】

【网口交换机:交换机KSZ9897学习-笔记-资料汇总-记录】1、概述2、 自己的学习与摸索之路第一阶段:随意在网上查找相关资料第二阶段:针对性在网上资料第三阶段:测试并且使用开发板第四阶段:针对性使用工具进行测试。2、…...

linux信号量及其实例

概述 Linux信号量是用于进程间同步和互斥的一种通信机制。本质是计数器 它们通常用于控制对共享资源的访问,以确保只有一个进程可以同时访问该资源。以下是一个详细的教程和C语言代码示例,展示如何使用信号量进行进程间通信。 创建信号量 要使用信号量…...

Nomogram | 盘点一下绘制列线图的几个R包!~(一)

1写在前面 列线图,又称诺莫图(Nomogram),是一种用于预测模型的可视化工具,它可以将多个影响因素和结局事件的关系展示在同一平面上。🥳 列线图最早是由法国工程师Philbert Maurice dOcagne于1884年发明的&a…...

两个数组的交集(力扣刷题)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/intersection-of-two-arrays 说…...

SonarQube 10.0 (macOS, Linux, Windows) - 清洁代码 (Clean Code)

请访问原文链接:https://sysin.org/blog/sonarqube-10/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Sonar Clean Code Industry leading solutions IDE | SonarLint Free IDE extension that provides on-the-f…...

怎么统一把文件名不需要部分批量替换掉

同事把文件传给我,我接在电脑上看发现文件名都是乱的,前面都加了一串挺长的数字,总之看起来很乱,顺序也跟着乱了,如何把红色框内部分删除掉呢? 上图就是我收到同事发我文件呢,你说要什么修改呢&…...

Vue3电商项目实战-结算支付 3【05-结算-收货地址-添加、06-结算-收货地址-修改、07-结算-提交订单】

文章目录05-结算-收货地址-添加06-结算-收货地址-修改07-结算-提交订单05-结算-收货地址-添加 目的:实现收货地址的添加。 大致步骤: 独立组件,准备一个对话框完成表单布局完成确认添加操作 落的代码: 1.独立组件,准…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

xmind转换为markdown

文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...