【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.rhkb.cn/news/250317.html

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

相关文章

基于SpringBoot Vue单位考勤管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

C#——三角形面积公式

已知三角形的三个边&#xff0c;求面积&#xff0c;可以使用海伦公式。 因此&#xff0c;可以执行得到三角形面积公式的计算方法代码如下&#xff1a; /** / <summary>* / 三角形面积公式* / </summary>* / <param name"a">边长a</param>*…

Android矩阵Matrix裁切setRectToRect拉伸Bitmap替代Bitmap.createScaledBitmap缩放,Kotlin

Android矩阵Matrix裁切setRectToRect拉伸Bitmap替代Bitmap.createScaledBitmap缩放&#xff0c;Kotlin class MyImageView : AppCompatImageView {private var mSrcBmp: Bitmap? nullprivate var testIV: ImageView? nullconstructor(ctx: Context, attrs: AttributeSet) :…

VUE3+TS使用OpenSeadragon学习之旅,实现多图片切换效果

1.官方网站&#xff1a;OpenSeadragon 2.使用npm下载插件&#xff1a;npm install openseadragon 3.在 index.html文件引入资源 <link rel"stylesheet" href"node_modules/openseadragon/build/openseadragon/openseadragon.css" /><script src…

Python GCN、GAT、MP等图神经网络学习,从入门全面概述和讲解GNN,入门到精通图神经网络

1. 图的分类&#xff1a; 1.1 根据边的方向性&#xff1a; 有向图&#xff08;Directed Graph&#xff09;&#xff1a;图中的边具有方向性&#xff0c;表示节点之间的单向关系。例如&#xff0c;A指向B的边表示节点A指向节点B。无向图&#xff08;Undirected Graph&a…

LVGL部件7

一.图片部件 1.知识概览 2.函数接口 1.lv_img_set_pivot 在LVGL&#xff08;LittlevGL&#xff09;中&#xff0c;要设置图像对象的旋转中心点&#xff0c;可以使用 lv_img_set_pivot 函数。该函数的原型如下&#xff1a; void lv_img_set_pivot(lv_obj_t * img, lv_coord_…

idea项目如何上传gitee

1.先创建仓库&#xff08;nonono&#xff01;&#xff01;&#xff01;idea上传会自动创建仓库&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 2.从gitee上面clone下来&#xff08;nonono&#xff01;&#xff01;&#xff01;&#xff01;这个.git文件也是自动…

6-TAMRA NH2,四甲基罗丹明氨基,常用于生物标记和荧光检测实验

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;6-TAMRA amine&#xff0c;6-TAMRA NH2&#xff0c;四甲基罗丹明氨基 一、基本信息 产品简介&#xff1a;6-TAMRA amine is widely used in various biomarker and fluorescence detection experiments. 6-TAMRA am…

前端通过nginx,访问一个文件夹里面的全部数据,nginx 咋配置

目录 1 问题2 实现 1 问题 前端通过nginx,访问一个文件夹里面的全部数据&#xff0c;nginx 咋配置 2 实现 location /logs {alias /mnt/www/logs/;autoindex on; }

小程序中picker多列选择器

需求&#xff1a;实现类似省市联动的效果&#xff0c;选择第一列后&#xff0c;第二列数据变化 html部分: <view class"section"><view>多列选择器</view><picker mode"multiSelector" bindchange"bindMultiPickerChange"…

tcpdump在手机上的使用

首先手机得root才可以&#xff0c;主要分析手机与手机的通信协议 我使用的是一加9pro&#xff0c; root方法参考一加全能盒子、一加全能工具箱官方网站——大侠阿木 (daxiaamu.com)https://optool.daxiaamu.com/index.php tcpdump&#xff0c;要安装在/data/local/tmp下要arm6…

Flutter 高级动画技术综合指南

在动画领域&#xff0c;Flutter 提供了一系列功能&#xff0c;包括基于物理的动画&#xff0c;可以模拟真实世界的动态&#xff0c;在应用程序中创建更逼真和自然的运动。 本文将深入研究 Flutter 动画&#xff0c;探索各种类型&#xff0c;并演示如何在项目中实现它们。 Flu…

【自然语言处理】P2 PyTorch 基础 - 张量

目录 安装 PyTorch张量创建张量操作张量索引、切片、联合操作 CUDA张量 本系列博文我们将使用 PyTorch 来实现深度学习模型等。PyTorch 是一个开源的、社区驱动的深度学习框架。拥有强大的工具和库生态系统&#xff0c;包含 TorchVision&#xff08;用于图像处理&#xff09;、…

Android Studio非UI线程修改控件——定时器软件

目录 一、UI界面设计 1、UI样式 2、XML代码 二、功能编写 1、定义 2、实现方法 3、功能实现 一、UI界面设计 1、UI样式 2、XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android…

Redmine项目管理工具的常见替代方案:从功能到优劣势的全方位分析

RedMine是一个非常受欢迎的项目管理工具&#xff0c;但它并不是万能的。随着时间的推移&#xff0c;许多功能和特性可能会发生变化或被取消。 因此&#xff0c;有许多其他工具可以成为RedMine的替代品。以下是六种可能的选择&#xff1a; 1、Zoho Projects&#xff1a; Zoho Pr…

CSC联合培养博士申请亲历|联系外导的详细过程

在CSC申报的各环节中&#xff0c;联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章&#xff0c;非常详细且真实地记录了申请过程、心理感受&#xff0c;并提出有益的建议&#xff0c;小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始&#xff0c;其…

【C/C++ 11】贪吃蛇游戏

一、题目 贪吃蛇游戏机制是通过控制蛇上下左右移动并吃到食物得分。 蛇头碰到墙壁或者碰到蛇身就游戏结束。 食物随机生成&#xff0c;蛇吃到食物之后蛇身变长&#xff0c;蛇速加快。 二、算法 1. 初始化游戏地图并打印&#xff0c;地图的边缘是墙&#xff0c;地图的每个坐…

JMeter GUI:测试计划和工作台

什么是测试计划&#xff1f; 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试所需的所有元素&#xff08;如线程组、计时器等&#xff09;及其相应的设置。 下图显示了测试计划的示例 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试…

Flutter 仿抖音 TikTok 上下滑动 播放视频

Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架&#xff0c;视频播放使用 video_player github&#xff1a;GitHub - PangHaHa12138/TiktokVideo: Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架 实现功能&#xff1a; 1.上下滑动自动播放切换视频&#xff0c;loading 封面…

k8s kubeadm部署安装详解

目录 kubeadm部署流程简述 环境准备 步骤简述 关闭 防火墙规则、selinux、swap交换 修改主机名 配置节点之间的主机名解析 调整内核参数 所有节点安装docker 安装依赖组件 配置Docker 所有节点安装kubeadm&#xff0c;kubelet和kubectl 定义kubernetes源并指定版本…