Python建造者模式介绍、使用方法

一、Python建造者模式简介

        1. 概念

建造者模式(Builder Pattern)是一种创建型设计模式,它可以将复杂对象的构造与表示分离,使得同样的构建过程可以创建不同的表现形式。该模式通过一步一步创建复杂对象,将对象的构造过程与表示过程解耦。

        2. 功能

建造者模式使得对象的构造过程与其表现形式相互独立,可以灵活地组合不同的构造过程来得到不同的表现形式。

        3. 优点

  • 将对象的构造过程与其表现形式解耦,可以灵活地组合不同的构造过程来得到不同的表现形式。
  • 使得代码结构更加清晰,易于维护和扩展。
  • 可以有效地控制对象的创建过程,生成符合设计要求的对象。

        5. 缺点

  • 建造者模式需要编写较多的代码,且在构造对象时需要一定的时间和精力。
  • 如果需要创建的对象较少或者结构较简单,则建造者模式可能会增加代码的复杂性。

        6. 应用场景

建造者模式通常应用于以下场景:

  • 需要创建复杂对象。
  • 需要创建一系列相关的对象,且它们的构造过程大致相同。
  • 需要在构造对象时对其进行一定的控制,以确保生成的对象符合设计要求。

        7. 使用方式

在Python中,可以使用类和方法来实现建造者模式。通常来说,建造者模式包括以下几个组成部分:

  • 产品类(Product):表示被构造的复杂对象。
  • 抽象建造者类(Builder):声明抽象方法来构建不同部分的复杂对象。
  • 具体建造者类(Concrete Builder):实现抽象建造者类中的方法来构建对象的各个部分,并返回构建好的对象。
  • 指挥者类(Director):负责调用具体建造者类中的方法来构建复杂对象。

        8. 在应用程序开发中的应用

建造者模式在应用程序开发中的应用场景较为广泛。例如,在 Web 开发中,我们可以使用建造者模式来构建复杂的 HTML 页面、邮件消息等。在游戏开发中,我们可以使用建造者模式来生成游戏场景、角色等。在数据库开发中,我们可以使用建造者模式来构建 SQL 查询语句等。

二、建造者模式示例

工作原理

Python建造者模式的工作原理主要涉及以下几个角色和步骤:

  1. 产品类(Product):表示被构造的复杂对象。

  2. 抽象建造者类(Builder):声明抽象方法来构建不同部分的复杂对象。

  3. 具体建造者类(Concrete Builder):实现抽象建造者类中的方法来构建对象的各个部分,并返回构建好的对象。

  4. 指挥者类(Director):负责调用具体建造者类中的方法来构建复杂对象。

具体的工作流程如下:

  1. 创建一个产品类,该类表示待构建的复杂对象,可以包含多个部分。

  2. 创建一个抽象的建造者类,该类声明了构建不同部分的抽象方法。

  3. 创建具体的建造者类,该类实现抽象建造者类中的方法,构建对象的各个部分,并返回构建好的对象。

  4. 创建一个指挥者类,该类负责调用具体建造者类中的方法来构建复杂对象。

  5. 在应用程序中,创建具体建造者类的实例,并将其传递给指挥者类。指挥者类使用具体建造者类中的方法来构建复杂对象。

  6. 最后,应用程序可以使用构建好的复杂对象。

Python建造者模式的工作原理可以简化为:通过把复杂对象的构造过程与表现分离,以及灵活组合不同的构造过程来得到不同的表现形式。其核心在于分步骤构造对象,使得对象的构造过程与表现相互独立,同时可以通过更改构造过程的某些部分来得到不同的表现形式。

示例

假设我们需要构建一个计算机,计算机包含CPU、内存、硬盘、显卡等部件。我们可以使用Python建造者模式来构建这个复杂对象。具体实现步骤如下:

  1. 首先创建一个产品类——计算机类,它包含CPU、内存、硬盘、显卡等部件,并提供各个部件的设置和获取方法。
  2. 然后创建一个抽象建造者类——计算机建造者类,它声明了构建不同部分的抽象方法:
  3. 接着创建具体的建造者类——台式机建造者类和笔记本建造者类,它们实现了抽象建造者类中的方法,构建对象的各个部分,并返回构建好的对象:
  4. 由于计算机建造的过程比较复杂,我们需要创建一个指挥者类——计算机装配员类,它负责调用具体建造者类中的方法来构建复杂对象:
  5. 最后,我们可以使用以上代码来创建不同的计算机,例如:

# 创建产品类
class Computer():def __init__(self):self.cpu = Noneself.memory = Noneself.hark_disk = Noneself.graphics_card = Nonedef set_cpu(self, cpu):self.cpu = cpudef set_memory(self, memory):self.memory = memorydef set_hard_disk(self, hard_disk):self.hark_disk = hard_diskdef set_graphics_card(self, graphics_card):self.graphics_card = graphics_carddef get_specs(self):specs = f'CPU:{self.cpu}\nMemory:{self.memory}\nHard Disk:{self.hark_disk}\nGraphics Card:{self.graphics_card}'return specs# 创建抽象的建造者类
class ComputerBuilder():def build_cpu(self): # 声明构建不同部分的抽象方法passdef build_memory(self):passdef build_hard_disk(self):passdef build_graphics_card(self):passdef get_computer(self):pass# 创建具体的建造者类
class DesktopBuilder(ComputerBuilder): # 继承抽象的建造者类def __init__(self):self.computer = Computer() # 初始化产品类def build_cpu(self): # 实现抽象建造者方法self.computer.set_cpu("Intel Core 7") # 设置产品类方法值def build_memory(self):self.computer.set_memory("16GB DDR4")def build_hard_disk(self):self.computer.set_hard_disk("1TB HDD")def build_graphics_card(self):self.computer.set_graphics_card("NVIDIA GTX 1050")def get_computer(self):return self.computerclass LaptopBuilder(ComputerBuilder):def __init__(self):self.computer = Computer()def build_cpu(self):self.computer.set_cpu("Intel Core i5")def build_memory(self):self.computer.set_memory("8GB DDR4")def build_hard_disk(self):self.computer.set_hard_disk("256GB SSD")def build_graphics_card(self):self.computer.set_graphics_card("Intergrated")def get_computer(self):return self.computer
# 创建指挥者
class ComputerAssembler:def __init__(self,builder):self.builder = builderdef assemble(self):self.builder.build_cpu() # 调用具体建造者类方法self.builder.build_memory()self.builder.build_hard_disk()self.builder.build_graphics_card()return self.builder.get_computer()
# 创建台式计算机
desktop_builder = DesktopBuilder()
desktop_assembler = ComputerAssembler(desktop_builder)
desktop = desktop_assembler.assemble()
print(desktop.get_specs())# 创建笔记本计算机
laptop_builder = LaptopBuilder()
laptop_assembler = ComputerAssembler(laptop_builder)
laptop = laptop_assembler.assemble()
print(laptop.get_specs())

输出结果如下:

CPU:Intel Core 7
Memory:16GB DDR4
Hard Disk:1TB HDD
Graphics Card:NVIDIA GTX 1050
CPU:Intel Core i5
Memory:8GB DDR4
Hard Disk:256GB SSD
Graphics Card:Intergrated

通过以上示例,我们可以看到Python建造者模式的使用方法,它通过分步骤构造对象,使得对象的构造过程与表现相互独立,同时也提供了更好的灵活性和可维护性。

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

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

相关文章

web前端tips:js继承——原型链继承

原型链继承 原型链继承是 JavaScript 中实现继承的一种方式,它通过使用原型来实现对象之间的继承关系。 在 JavaScript 中,每个对象都有一个原型(prototype),它是一个指向另一个对象的引用。当我们访问一个对象的属性…

什么是算法

算法的概念 算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵魂 一、算法的特征…

云计算迎来中场战役,MaaS或将成为弯道超车“新赛点”

科技云报道原创。 没有人能预见未来,但我们可以因循常识,去捕捉技术创新演进的节奏韵脚。 2023年最火的风口莫过于大模型。 2022年底,由美国初创企业OpenAI开发的聊天应用ChatGPT引爆市场,生成式AI成为科技市场热点&#xff0c…

ES6:Object.assign方法详解

ES6:Object.assign方法详解 1、前言2、语法3、基本用法3.1 目标对象和源对象无重名属性3.2 目标对象和源对象有重名属性3.3 有多个源对象3.4 其他情况3.4.1 只有一个参数时,Object.assign会直接返回该参数3.4.2 如果该参数不是对象,则会先转成…

每日一道面试题之介绍一下Iterator

Iterator是Java中的一个接口,用于遍历集合(Collection)中的元素。通过Iterator,可以按顺序访问集合中的每个元素,而无需了解集合的内部实现细节。 使用Iterator的一般步骤如下: 通过调用集合的iterator()…

SOC FPGA之HPS模型设计(二)

根据SOC FPGA之HPS模型设计(一), Quartus工程经过全编译后会产生Handoff文件夹、SOPCINFO文件、SVD文件 二、生成Preloader镜像文件 通过信息交换文件Handoff文件生成Preloader,需要用到SOC EDS Preloader也被称为spl(Second Program Loader)或u-boot…

【云原生 • Kubernetes】认识 k8s、k8s 架构、核心概念点介绍

目录 一、Kubernetes 简介 二、Kubernetes 架构 三、Kunbernetes 有哪些核心概念? 1. 集群 Cluster 2. 容器 Container 3. POD 4. 副本集 ReplicaSet 5. 服务 service 6. 发布 Deployment 7. ConfigMap/Secret 8. DaemonSet 9. 核心概念总结 一、Kubern…

基于Ko-time的Springboot单体化调用链追踪实践

目录 前言 一、关于Ko-Time 1、是什么? 2、ko-time更新时间线 二、Ko-time怎么用? 1、依赖引入 2、配置集成 3、权限放行 三、链路追踪 1、系统运行 2、链路追踪 3、长时间调用模拟 总结 前言 熟悉微服务的老司机一定了解,在微服务模…

Web端即时通讯技术(SEE,webSocket)

目录 背景简介个人见解被动推送轮询简介实现 长轮询(comet)简介实现 比较 主动推送长连接(SSE)简介实现GETPOST 效果 webSocket简介WebSocket的工作原理:WebSocket的主要优点:WebSocket的主要缺点: 实现用法一用法二 **效果** 比较…

学习笔记|大模型优质Prompt开发与应用课(二)|第四节:大模型帮你写代码,小白也能做程序

文章目录 01软件开发产业趋势与技术革新软件开发产业趋势与技术革新技术性人才很受欢迎软件开发产业趋势与技术革新技术门槛越来越低 02 大模型驱动的软件开发需求分析prompt 产品设计开发和测试prompt输出回复promptpromptprompt回复 发布和部署promptprompt 维护和更新prompt…

Docker中的网络

文章目录 网络网桥(bridge)创建网桥接口hostnonecontaineroverlayoverlay底层原理 网络 网桥(bridge) 在Docker中,网桥(Bridge)是一种网络驱动,用于实现Docker容器之间和容器与宿主…

SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交

场景 SpringBootRedis自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数): SpringBootRedis自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)_redis防刷_霸道流氓气质的博客-CSDN博客 以下接口幂等性的实现方式与上面博客类似,…

MySQL - 记一次 HikariDataSource + Etcd 组合技打爆数据库连接数

问题描述 如题所述,我们每新增一个数据源并且往 etcd 去生产的时候,etcd 消费者收到监听到的内容去消费,产生大量的数据库连接(通过 SHOW PROCESSLIST 查到) 原因分析 故事是因为项目本身有一个多租户功能&#xff0…

剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失

💡本篇内容:剑指YOLOv7改进最新MPDIoU损失函数(23年7月首发论文):论文实测YOLOv7模型涨点,超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv7原…

python pygbag教程 —— 在网页上运行pygame程序(全网中文教程首发)

pygame是一款流行的游戏制作模块,经过特殊的方式编译后,可以在浏览器web网页上运行。web上的打包主要使用第三方模块pygbag。 pygame教程:Python pygame(GUI编程)模块最完整教程(1)_pygame模块详解_Python-ZZY的博客-…

【配置环境】Windows下 VS Code 远程连接虚拟机Ubuntu

一,环境 Windows 11 家庭中文版VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 二,关键步骤 Windows下安装OpenSSHVS Code安装Remote - SSH插件 三,详细步骤 在Ubun…

kotlin获取泛型集合的类型信息

通过 reified 关键字和内联函数来实现 inline fun <reified T> getClassFromList(list: List<T>): Class<T> {return T::class.java }fun main() {val list listOf("Hello", "World")val clazz getClassFromList(list)println(clazz)…

React 前端应用中快速实践 OpenTelemetry 云原生可观测性(SigNoz/K8S)

OpenTelemetry 可用于跟踪 React 应用程序的性能问题和错误。您可以跟踪从前端 web 应用程序到下游服务的用户请求。OpenTelemetry 是云原生计算基金会(CNCF)下的一个开源项目&#xff0c;旨在标准化遥测数据的生成和收集。已成为下一代可观测平台的事实标准。 React(也称为 Re…

【K8s】k8s配置存储卷PersistentVolumeClaim里的readwriteonce是什么意思

示例 参考这个示例 对于其中的ReadWriteOnce参数 ReadWriteOnce是Kubernetes PersistentVolume的访问模式之一。具体来说&#xff1a; ReadWriteOnce&#xff1a;卷可以被一个节点以读写模式挂载。ReadOnlyMany&#xff1a;卷可以被多个节点以只读模式挂载。ReadWriteMany&…

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解

一、介绍 kotlin的语法千奇百怪&#xff0c;今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数&#xff1f; 内联函数 的语义很简单&#xff1a;把函数体复制粘贴到函数调用处 。使用起来也毫无困难&#xff0c;用 inline关键字修饰函数即可。 语法&a…