建造者模式:构造复杂对象的艺术

在面向对象的设计中,建造者模式是一种重要的创建型设计模式,专门用来构建复杂的对象。它主要目的是将对象的构造代码与其表示代码分离,使同样的构建过程可以创建不同的表示。本文将详细介绍建造者模式的定义、实现、应用场景以及优缺点,帮助您深入理解并有效应用这一模式。

在这里插入图片描述

1. 建造者模式的定义

建造者模式(Builder Pattern)允许你创建不同风格的对象,同时避免构造器污染。当对象的创建算法应该独立于组成对象的部件及其装配方式时,这种模式尤其有用。建造者模式通常用来处理那些包含多个成员属性的类,尤其是当这些属性是可选的时。

2. 实现建造者模式

在Python中,建造者模式可以通过创建一个指导者(Director)和多个建造者(Builder)来实现。下面是一个简单的例子:

class Product:def __init__(self):self.parts = []def add(self, part):self.parts.append(part)def list_parts(self):print(f"Product parts: {', '.join(self.parts)}")class Builder:def __init__(self):self.product = Product()def build_part_a(self):passdef build_part_b(self):passdef build_part_c(self):passdef get_result(self):return self.productclass ConcreteBuilder1(Builder):def build_part_a(self):self.product.add("PartA1")def build_part_b(self):self.product.add("PartB1")class ConcreteBuilder2(Builder):def build_part_a(self):self.product.add("PartA2")def build_part_c(self):self.product.add("PartC2")class Director:def __init__(self):self._builder = Nonedef set_builder(self, builder):self._builder = builderdef build_minimal_viable_product(self):self._builder.build_part_a()def build_full_featured_product(self):self._builder.build_part_a()self._builder.build_part_b()self._builder.build_part_c()# 使用指导者和建造者构建产品
director = Director()
builder1 = ConcreteBuilder1()
director.set_builder(builder1)
director.build_full_featured_product()
product = builder1.get_result()
product.list_parts()  # 输出: Product parts: PartA1, PartB1, PartC1

3. 建造者模式的应用实例

建造者模式在软件开发中有广泛的应用,特别是在需要构建复杂对象的场景中,如:

  • 文本编辑器的文档构造:构建具有不同格式的复杂文档。
  • UI设计器:构建复杂的UI界面,如窗口或对话框。
  • 游戏开发:构建复杂的游戏角色或游戏场景。

4. 优点和缺点

优点:

  • 封装性好:客户不需要了解产品内部组成的细节。
  • 构建和表示分离:提高了系统的灵活性。

缺点:

  • 设计复杂:增加了系统的复杂性,尤其是增加了多个新类。

5. 总结

建造者模式为复杂对象的创建提供了高度的灵活性和控制力。通过将对象的构造过程封装在一个称为‘建造者’的独立对象中,这一模式不仅确保了代码的清晰,也便于未来的扩展和维护。

更多Python编程相关文章:cpython666.github.io

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

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

相关文章

数字乡村创新实践探索农业现代化与乡村振兴新路径:科技赋能农村全面振兴与农民幸福新篇章

随着信息技术的飞速发展,数字乡村成为推动农业现代化与乡村振兴的重要战略举措。科技赋能下的数字乡村创新实践,不仅提升了农业生产的智能化水平,也为乡村治理和农民生活带来了翻天覆地的变化。本文旨在探讨数字乡村创新实践在农业现代化与乡…

Mac环境 llamafile 部署大语言模型LLM

文章目录 Github官网本地部署 llamafile 是一种可在你自己的电脑上运行的可执行大型语言模型(LLM),它包含了给定的开放 LLM 的权重,以及运行该模型所需的一切。让人惊喜的是,你无需进行任何安装或配置。 Github https…

年龄与疾病c++

题目描述 某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18岁、19-35岁、36-60岁、61以上(含61)四个年龄段统计的患病人数以及占总患病人数的比例。 输入 共2行,第一行为过…

ctfshow--web入门--文件上传--web168--web170

web168 法一免杀脚本 还是检查&#xff0c;准备上传图片马 我写的是<?php eval($_POST[a]);?> 上传之后没反应 那么查一下&#xff0c;原来是发现对eval,system还有$_POST和$_GET进行过滤,$_REQUEST还可以用 那么再写一个马&#xff08;免杀脚本&#xff09; <?…

AI 文献综述工具

find sources that support this statement:

Redis入门(常用命令、spring-boot-starter-data-redis)

Redis redis是一个基于内存的key-value的结构数据库 启动&#xff1a; redis-server.exe redis.windows.conf 客户端链接&#xff1a;redis-cli.exe [-h 目标ip] [-p 端口] [-a 密码] 修改链接密码&#xff1a; 在redis.windows.conf中的requirepass 123456 常用的数据类…

前端三剑客 —— JavaScript (第八节)

目录 内容回顾&#xff1a; 事件对象 事件对象 事件对象的方法和属性 案例-移动DIV 案例-图片轮换 Ajax 内容回顾&#xff1a; 事件对象 1.1 什么是事件驱动 1.2 事件绑定 事件源&#xff1a;发生事件的源对象 事件对象&#xff1a;它包含了事件所有的信息&#xff0c;它…

[攻防世界]Reversing-x64Elf-100

1.查壳 无壳&#xff0c;ELF文件 2.用IDA64打开 找到关键部分 这里有坑&#xff0c;看清楚v3是长度为3数组&#xff0c;里面放三个字符串 3.脚本解密 v1"Dufhbmf" v2"pGimos" v3"ewUglpt" v4[v1,v2,v3] a1[0,0,0,0,0,0,0,0,0,0,0,0] for i …

使用cmake进行打包,包含可执行程序和动态依赖库

平常代码开发中&#xff0c;有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程&#xff0c;实现使用make -jnproc package指令可以将工程进行打包&#xff0c;可执行文件存储在bin文件夹中&#xff0c;依赖库存储在lib文件夹中。 示例 1.工程目录结…

算法打卡day41|动态规划篇09| Leetcode198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

算法题 Leetcode 198.打家劫舍 题目链接:198.打家劫舍 大佬视频讲解&#xff1a;198.打家劫舍视频讲解 个人思路 偷还是不偷&#xff0c;这取决于前一个和前两个房是否被偷了&#xff0c;这种存在依赖关系的题目可以用动态规划解决。 解法 动态规划 动规五部曲&#xff1…

B端系统:控制台图表的十大常见类型,附精美案例

大家伙&#xff0c;我是大千UI工场&#xff0c;专注UI分享和项目接单&#xff0c;本期带来控制台图表的常见类型&#xff0c;欢迎大家关注、互动交流。 B端系统控制台的图表类型有很多种&#xff0c;常见的包括&#xff1a; 折线图&#xff1a;用于显示随时间变化的数据趋势&a…

Spring Boot 学习(3)——Spring Initializr 创建项目问题解决

产生问题的原因&#xff0c;各种的版本都较老&#xff0c;所以导致出现问题。目前暂未打到合适的教程&#xff0c;按老教程学起来先。 小白瞎学&#xff0c;大神勿喷&#xff01; 再次强调环境&#xff1a;maven 3.3.9、jdk 1.8、idea 2017、Spring 4.3.13、Spring Boot 1.5.…

【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数…

设计者模式之中介者模式(下)

3&#xff09;中介者与同事类的扩展 1.结构图 新增了具体同事类Label和具体中介者类SubConcreteMediator。 2.代码实现 //文本标签类&#xff1a;具体同事类 public class Label extends Component {public void update() {System.out.println("文本标签内容改变&#…

鉴权设计(一)———— 登录验证

1、概述 网站系统出于安全性的考虑会对用户进行两个层面的校验&#xff1a;身份认证以及权限认证。这两个认证可以保证只有特定的用户才能访问特定的数据的需求。 本文先实现一个基于jwt拦截器redis注解实现的简单登录验证功能。 2、设计思路 jwt用于签发token。 拦截器用于拦…

南京观海微电子---二极管钳位电路

在选择电阻器和电容器时&#xff0c;您必须注意电容器的放电时间&#xff0c;因为它会保持波形的时间段。它必须比时间段的一半大得多&#xff0c;以便电容器放电缓慢。电解电容器不应用于钳位电路&#xff0c;因为它们的充电和放电速度很慢。放电时间&#xff08;&#xff09;…

容器镜像进阶

Dockerfile 编写注意事项&#xff1a; 选择合适的基础镜像&#xff0c;没必要追求镜像的绝对大小。 alpine镜像不推荐&#xff0c;尤其是编译型业务&#xff0c;因为alpine镜像内置的musl libc库与标准的glibc不一样。 如果就是想使用alpine镜像&#xff0c;推荐多阶段构建&am…

2023-2024年科技行业主要变化趋势梳理与总结

一、主要大额并购案例并购原因 &#xff08;一&#xff09;产品线补充与业务市场拓展&#xff08;如VMware、Activision Blizzard并购案&#xff09; &#xff08;二&#xff09;技术整合&#xff08;如Spunk并购案&#xff09;、 &#xff08;三&#xff09;优化运营以期溢…

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量…

C++ 红黑树模拟实现

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 前言 前面我们实现了AVL树&#xff0c;发明AVL树…