【python设计模式】4、建造者模式
哲学思想:
建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤,并将这些步骤分别封装在一个独立的建造者类中。然后,我们可以使用一个指挥者类来控制建造者的调用顺序,以便在每个步骤完成后正确地构建复杂对象。
建造者模式的另一个哲学思想是,将对象的构建与其表示分离开来。这意味着我们可以使用相同的构建过程来创建不同的表示形式,而不必改变建造者的代码。例如,我们可以使用相同的建造者类来创建不同的文本编辑器,如 Word、Notepad 和 Sublime Text。
通过将对象的创建过程分解成多个简单的步骤,我们可以更好地控制对象的创建过程,并且可以将其组合方式变得更加灵活。同时,建造者模式也可以帮助我们隐藏对象的创建过程,从而提高代码的可维护性和可扩展性。例如,在需要添加新的建造者或修改某个建造者时,我们只需要修改指挥者类或建造者类,而不必改变客户端的代码。
总之,建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤,并将其组合方式变得更加灵活,同时将对象的构建与其表示分离开来,以提高代码的可维护性和可扩展性。
简介:
建造者模式是一种创建型设计模式,它允许您逐步构造复杂对象。与直接实例化复杂对象不同,建造者模式将对象的构造过程分解为一系列步骤,使您可以逐个处理这些步骤。
建造者模式的核心思想是将一个复杂对象的构造过程和它的表示分离开来,使得同样的构造过程可以创建不同的表示。通常情况下,一个建造者模式包括以下四个角色:
- Product(产品):表示被建造的复杂对象,包含多个部件。
- Builder(抽象建造者):定义构造过程的接口,包括创建各个部件的抽象方法。
- ConcreteBuilder(具体建造者):实现 Builder 接口,构造和装配各个部件,同时提供一个返回产品的方法。
- Director(指挥者):负责安排各个部件的构造顺序,告诉 Builder 需要创建哪些部件,以及如何组装它们。
建造者模式可以使得代码更加灵活和可扩展,因为它将对象构造过程的细节隐藏了起来,客户端只需要指定需要建造的对象类型和相关参数,而无需了解其构造细节。此外,建造者模式也使得对象的构造过程更加模块化,有助于代码的维护和复用。
建造者模式常用于创建复杂的对象,例如,文本编辑器、电子表格程序和图形用户界面。
优点:
-
将复杂对象的构造过程和表示分离。这使得客户端可以更加简单地创建对象,同时也使得代码更加灵活和易于维护。
-
可以使用相同的构造过程来创建不同的对象表示。因为建造者模式将构造过程和表示分离,所以您可以使用相同的构造过程来创建不同的对象表示。这样可以大大减少代码的重复,并且使得对象表示更加易于扩展。
-
支持逐步构建复杂对象。建造者模式允许您逐步构建复杂对象,因为您可以分解对象构造过程为一系列简单的步骤,并逐步完成每个步骤。这样可以使得构造过程更加可控,同时也有助于代码的维护和测试。
-
代码结构清晰。建造者模式的代码结构清晰,并且易于理解和扩展。因为建造者模式将构造过程分解为一系列步骤,并将其封装在不同的类中,所以可以更加清晰地组织代码。
缺点
-
建造者模式的实现较为复杂。由于建造者模式将对象的构造过程分解为多个步骤,所以需要创建多个类来实现建造者模式。这会增加代码量和复杂度,使得代码变得更难理解和维护。
-
建造者模式要求建造者类必须知道产品的内部结构。由于建造者类需要创建产品的各个部分并组装它们,所以必须了解产品的内部结构。这种紧密耦合的设计使得建造者模式的扩展性和灵活性变得较差。
-
建造者模式不适用于创建简单的对象。由于建造者模式将对象构造过程分解为多个步骤,所以如果要创建简单的对象,建造者模式会增加代码的复杂度,使得代码变得更加冗长和难以理解。
-
建造者模式可能会导致对象数量增加。由于建造者模式创建的对象是由多个部件组成的,所以可能会导致对象的数量增加,从而占用更多的内存空间。
应用实例:
-
游戏开发:游戏中的角色、道具、装备等都是由多个部分组成的,使用建造者模式可以方便地组装各个部分,并创建出一个完整的游戏对象。
-
操作系统内核开发:操作系统内核中的进程、线程等都是由多个部分组成的,使用建造者模式可以方便地创建出一个完整的进程或线程对象。
-
汽车制造业:汽车是由多个部件组成的,使用建造者模式可以方便地组装各个部件,并创建出一个完整的汽车对象。
-
大型网站开发:大型网站通常包含多个模块,例如用户管理、订单管理、商品管理等,使用建造者模式可以方便地创建出一个完整的网站对象。
示例代码
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 基类和两个具体建造者类 ConcreteBuilder1 和 ConcreteBuilder2,它们都继承自 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.独立组件,准…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
大模型的LoRa通讯详解与实现教程
一、LoRa通讯技术概述 LoRa(Long Range)是一种低功耗广域网(LPWAN)通信技术,由Semtech公司开发,特别适合于物联网设备的长距离、低功耗通信需求。LoRa技术基于扩频调制技术,能够在保持低功耗的同时实现数公里甚至数十公里的通信距离。 LoRa的主要特点 长距离通信:在城…...
matlab模糊控制实现路径规划
路径规划是机器人和自动驾驶系统中的重要问题之一,它涉及确定如何在给定环境中找到最优路径以达到特定目标。模糊控制是一种有效的控制方法,可以应用于路径规划问题。 路径规划算法的目标是在避免障碍物的情况下,找到机器人或车辆从起点到终…...
AWS Elastic Beanstalk + CodePipeline(Python Flask Web的国区CI/CD)
目标 需要使用AWS Elastic Beanstalk 部署一个Python的Flask Web应用,并且使用CodePipeline作为CI/CD工作流。 eb部署图 前提 假设你已经有一个能够正常运行的Python的Flask Web应用项目代码,而且需要对已有Flask工程做一些调整。由于AWS Elastic Bea…...
深度优先算法学习
1: 从 1点出发到 15点 #include <stdio.h>#define MAX_NODES 100typedef struct {int node_id;int *nextNodes;int nextNodesSize; } Node;// 假设我们有一个节点数组,全局保存了所有节点 Node nodes[MAX_NODES];void dfs(int node_id) {Node *node &n…...
6.8 note
paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制: 准备阶段 - 提议者向所有接受者发送准备请求,请求中包含一个唯一的编号。 - 接受者收到请求后,会检查编号,如果编号比它之前见过的都大,就会承…...
AURA智能助手在物联网(IoT)和数字化改造领域的使用
要设计一款在物联网(IoT)和数字化改造领域占据市场主导的AURA智能助手,产品经理需从行业痛点、技术架构、商业模式、生态整合四大维度切入,深度融合工业场景的特殊性。以下是系统性设计框架与落地策略: 一、精准定位:直击工业场景核心痛点 1. 解决企业级关键问题 场景痛…...
