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

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

在这里插入图片描述

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; <?…

工业通信原理——SCI通信

工业通信原理——SCI通信 前言 SCI(串行通信接口)是一种常见的串行通信接口标准,用于在微控制器和外部设备之间进行串行通信。SCI通常用于实现点对点的、半双工的串行通信。 通信原理 物理连接:SCI通常通过串行数据线(TXD、RXD)、地线(GND)和可能的其他控制信号(如…

给原生的 Stable Diffusion 模型按个涡轮发动机——DeepCache

AI绘图虽然模型种类繁多&#xff0c;但是一直存在一个缺点就是不够快。以至于Stability公司专门做了Turbo系列和Cascade版本。但是这些终究治标不治本&#xff0c;终于在CVPR2024收入中&#xff0c;我觉得DeepCache是一次不错的尝试。 论文 《DeepCache: Accelerating Diffus…

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;它…

兼容性测试用例

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔:工作总结随笔_8、…

01-shell基础入门

一、Shell是什么&#xff1f; shell可以理解为连接用户和操作系统内核的接口&#xff0c;将用户命令编译成操作系统能够执行的指令传给内核。目前有多种shell实现 常用的Shell 一般在linux系统中&#xff0c;常见的shell有/bin/sh、/bin/bash等&#xff0c;它们代表我们的命…

ESP32 S3音频开发

1. 音频硬件框架 2. 音频软件框架

Golang教程六(单元测试,反射,网络编程,部署)

目录 一、单元测试 单元测试 子测试 TestMain 二、反射 类型判断 通过反射获取值 通过反射修改值 结构体反射 利用tag修改结构体的某些值 调用结构体方法 orm的一个小案例 对反射的一些建议 三、网络编程 socket编程 websocket编程 四、部署 打包命令 交叉编译…

[攻防世界]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 …

人工智能研究生前置知识—科学计算库numpy

人工智能研究生前置知识—科学计算库numpy numpy是python中做科学计算的基础库&#xff0c;对数组进行操作 整个numpy的操作和使用比较简单因此可以通过案例的学习掌握基本的用法在之后的学习中不断的进行熟悉和补充 创建数组&#xff08;矩阵 &#xff09; 创建的ndarray数组…

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

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

谷歌翻译接口-国内使用在线翻译API

对于翻译要求比较高的同学都知道Google翻译比现有市面上的翻译软件优势在哪里。下面来浅浅介绍一下其优点&#xff1a; 1、支持超过100种不同语言之间的互译&#xff0c;覆盖了全球主要语言。 2、基于机器学习技术&#xff0c;可根据用户大量的翻译数据不断优化和提升翻译的准确…

算法打卡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.…