【Python笔记-设计模式】建造者模式

一、说明

又称生成器,是一种创建型设计模式,使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。

(一) 解决问题

  1. 对象的创建问题:当一个对象的构建过程复杂,且部分构建过程相互独立时,可以使用建造者模式。例如,一个软件系统中需要创建一个复杂的对象,这个对象由多个部分组成,而这些部分可以独立地进行变更,这时候就可以使用建造者模式。
  2. 解耦问题:建造者模式将一个复杂对象的构建函数进行分离,使得同样的构建过程可以创建不同的表示。用户只需要指定需要建造的类型,不需要知道建造的过程和细节。

(二) 使用场景

  • 结构复杂:当对象有非常复杂的内部结构,有许多属性时
  • 拆分大量参数的构造函数
  • 希望使用代码创建不同形式的产品,制造过程相似且仅有细节上的差异

二、结构

  1. 生成器 (Builder)接口声明在所有类型生成器中通用的产品构造步骤。
  2. 具体生成器 (Concrete Builders)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品。
  3. 产品 (Products)是最终生成的对象。由不同生成器构造的产品无需属于同一类层次结构或接口。
  4. 主管 (Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定的产品配置。
  5. 客户端 (Client)必须将某个生成器对象与主管类关联。一般情况下,你只需通过主管类构造函数的参数进行一次性关联即可。此后主管类就能使用生成器对象完成后续所有的构造任务。但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。在这种情况下,你在使用主管类生产产品时每次都可以使用不同的生成器。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
建造者模式例:复用相同的对象构造代码来生成不同类型的产品——例如汽车 (Car)——及其相应的使用手册 (Manual)。
"""class Car:"""产品类"""def __init__(self):self.brand = Noneself.seats = Noneself.engine = Noneself.trip_computer = Noneself.gps = Nonedef __str__(self):return "汽车概况:\n     " + f"{self.__dict__}"class Manual:"""使用手册类"""def __init__(self):self.sections = []def add_section(self, feature, description):self.sections.append((feature, description))def __str__(self):return "使用手册:\n     " + "\n     ".join(f"{feature} - {description}" for feature, description in self.sections)class CarBuilder:"""生成器类"""def __init__(self):self._manual = Noneself._car = Noneself.reset()def reset(self):self._car = Car()self._manual = Manual()def set_brand(self, brand):self._car.brand = brandself._manual.add_section("Brand", f"这辆车的品牌是 {brand}")return selfdef set_seats(self, seats):self._car.seats = seatsself._manual.add_section("Seats", f"这辆车有 {seats} 个座位")return selfdef set_engine(self, engine):self._car.engine = engineself._manual.add_section("Engine", f"这辆车配备了一个 {engine} 引擎")return selfdef set_trip_computer(self, trip_computer):self._car.trip_computer = trip_computerif trip_computer:self._manual.add_section("Trip Computer", "这辆汽车装有行车电脑。")return selfdef set_gps(self, gps):self._car.gps = gpsif gps:self._manual.add_section("GPS", "这辆汽车装有全球定位系统(GPS)。")return selfdef get_car(self):return self._cardef get_manual(self):return self._manualclass Director:"""主管类主管只负责按照特定顺序执行生成步骤。由于客户端可以直接控制生成器,所以严格意义上来说,主管类并不是必需的。"""@staticmethoddef construct_sports_car1(builder):builder.reset()builder.set_brand("宝马").set_seats(4).set_engine("SportEngine").set_trip_computer(True).set_gps(True)@staticmethoddef construct_sports_car2(builder):builder.reset()builder.set_brand("奔驰").set_seats(6)def client_code():"""客户端代码"""director = Director()# 构建汽车和使用手册car_builder = CarBuilder()director.construct_sports_car1(car_builder)print(car_builder.get_car())print(car_builder.get_manual())print()director.construct_sports_car2(car_builder)print(car_builder.get_car())print(car_builder.get_manual())if __name__ == "__main__":"""汽车概况:{'brand': '宝马', 'seats': 4, 'engine': 'SportEngine', 'trip_computer': True, 'gps': True}使用手册:Brand - 这辆车的品牌是 宝马Seats - 这辆车有 4 个座位Engine - 这辆车配备了一个 SportEngine 引擎Trip Computer - 这辆汽车装有行车电脑。GPS - 这辆汽车装有全球定位系统(GPS)。汽车概况:{'brand': '奔驰', 'seats': 6, 'engine': None, 'trip_computer': None, 'gps': None}使用手册:Brand - 这辆车的品牌是 奔驰Seats - 这辆车有 6 个座位"""client_code()

四、优缺点

优点

  • 你可以分步创建对象,暂缓创建步骤或递归运行创建步骤。
  • 生成不同形式的产品时,你可以复用相同的制造代码。
  • 单一职责原则。你可以将复杂构造代码从产品的业务逻辑中分离出来。

缺点

  • 由于该模式需要新增多个类,因此代码整体复杂程度会有所增加。

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

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

相关文章

leetcode-704.二分查找

题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9输出: 4 解释: 9 …

Web性能优化之如何评估网页性能——性能指标和度量工具介绍

前言 用户在访问 web 网页时,大部分都希望网页能够在一秒完成。事实上,加载时间每多 1 秒,就会流失 7%的用户。如果时间超过 8s 用户就会感到不耐烦、会放弃访问。这也就是著名的 “8秒原则”。 虽然当今设备及网络环境都大幅提升&#xff…

Android 跳转应用设置/热点界面或等常用操作

Android 跳转应用设置/热点界面或等常用操作 https://www.jianshu.com/p/ba7164126690 android学习进阶——Setting https://blog.csdn.net/csdn_wanziooo/article/details/81980984 Android 7.1 以太网反射 EthernetManager 配置 DHCP、静态 IP https://codeleading.com/art…

Java List的合并与切分

在Java开发中经常遇到list结构数据的处理,如List的合并或拆分,记录下来,方便备查。 一、List 合并 两个list数据的合并处理,可使用Java8 新特性的stream流,根据实际需要遍历取值。 1、定义 UserInfo 对象 订单的相…

Request对象-获取请求消息

Request 概述:Request 和 Response 对象都是由 Web 服务器(Tomcat)创建的,我们来使用它们,Request 对象是用来 获取请求消息 的,Response 对象是用来 设置响应消息 的 Request 对象的原理 Request 对象的继承体系结构 Reque…

IS-IS的LSP分片扩展

原理 IS-IS通过泛洪LSP来宣告链路状态信息,由于一个LSP能够承载的信息量有限,IS-IS将对LSP进行分片。每个LSP分片由产生该LSP的结点或伪结点的SystemID、PseudnodeID(普通LSP中该值为0,Pseudonode LSP中该值为非0)、LSPNumber(LSP分片号)组合起来唯一标识,由于LSPNumb…

【大数据安全】数据管理安全安全分析隐私保护

目录 一、数据管理安全 (一)数据溯源 (二)数字水印 (三)策略管理 (四)完整性保护 (五)数据脱敏 二、安全分析 (一)大数据安全…

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

【Linux】环境基础开发工具的使用(一)

前言:在此之前我们学习了一些Linux的权限,今天我们进一步学习Linux下开发工具的使用。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:Linux的深度刨析 👈 💯代码仓库:卫卫周大胖的学习日记…

关于谷歌新版调试用具(Chrome Dev Tool ),网络选项(chrome-network)默认开启下拉模式的设置

今天在使用谷歌浏览器进行调试的时候,打开调试工具网络选项发现过滤不同模式的选项卡不见了,转而变成一个下拉式选项,如下图 这样一来使得切换不同类型查看的时候变得非常不方便,然后网上查了一下发现这个功能谷歌在很早版本就已…

前后端项目

文章目录 1.需求2.项目搭建2.1项目结构图2.2构建聚合工程2.2.1 zx-parent父工程2.2.2 zx-framework父工程2.2.2.1 zx-common工程2.2.2.2 zx-mybatisplus工程2.2.3 如上,同理创建其他父子工程2.3准备sql3.用户登录3.1 修改pom-依赖其他Module3.2 封装User1.需求 在线学习平台 …

笔记本电脑Win11重装系统教程

在笔记本电脑Win11操作过程中,用户如果遇到很严重的系统问题,就可以重新正常的Win11系统,快速解决Win11系统问题。但是,部分新手用户不知道不知道如何操作才能给Win11笔记本电脑重装系统?以下小编分享笔记本电脑Win11重…

LaTeX教程(003)-LaTeX文档结构(03)

LaTeX教程(003)- LaTeX \LaTeX LATE​X文档结构(03) 2.2 章节划分命令 在前面的内容中,我们讨论了文档的最顶层的区块划分,即front matter、main matter和back matter。这一节中,我们讨论如何在这些区块内部,使用章节划分命令对…

《Pandas 简易速速上手小册》第6章:Pandas 时间序列分析(2024 最新版)

文章目录 6.1 时间序列数据基础6.1.1 基础知识6.1.2 重点案例:股票市场分析6.1.3 拓展案例一:温度变化分析6.1.4 拓展案例二:电商平台日销售额分析 6.2 日期与时间功能6.2.1 基础知识6.2.2 重点案例:活动日志分析6.2.3 拓展案例一…

Nodejs基于Vue.js的网上团购系统86593

该系统将采用B/S结构模式,使用Vue和ElementUI框架搭建前端页面,后端使用Nodejs来搭建服务器,并使用MySQL,通过axios完成前后端的交互 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架:Express/koa 前端:V…

JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用 Arthas常用命令Arthas的安装Linux压测工具Apache Bench安装火焰图的使用火焰图如何分析火焰图的互动 Arthas常用命令 help :查看所有命令dashboard :仪表板,查看线程的CPU信息等heapdump :不同类对象占用内存比重&a…

MySQL数据库基础第三篇(约束)

文章目录 一、约束概述二、约束演示1.演示代码2.读出结果 三、外键约束1.创建外键2.删除更新外键 作为软件工程师和数据库管理员,我们经常需要操作和管理数据库。对于数据库中的信息完整性和准确性的确保,以及对数据质量的提升,数据库中的约束…

2023年09月CCF-GESP编程能力等级认证Python编程二级真题解析

一、单选题(共15题,共30分) 第1题 我国第一台大型通用电子计算机使用的逻辑部件是 ( )。 A:集成电路 B:大规模集成电路 C:晶体管 D:电子管 答案:D 第2题 下列流程图的输出结果是( )? A:5 12 B:12 5 C:5 5 D:12 12 答案:B 第3题 如果要找出整数 a …

【分布式技术专题】Guava RateLimiter 针对于限流器的入门到实战(含源码分析介绍)

Guava RateLimiter 针对于限流器的入门到实战 限流器的思路和算法漏桶算法令牌算法 RateLimiter限流器RateLimiter的作用create方法acquire方法tryAcquire方法 详细分析参数抛出异常参数抛出异常实践案例第1次获取10个令牌第2次获取1个令牌第3次获取10个令牌 资料参考 限流器的…

maven: 使用profiles进行多环境配置

文章目录 一、背景二、如何配置 一、背景 在项目开发的过程中会用到多个环境比如:本地环境(开发自测)、开发环境(环境部署自测)、生产环境等,由于不同的环境需要不同的配置信息,为了便于开发使…