当前位置: 首页 > news >正文

设计模式:建造者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《策略模式》                                                       下一篇《适配器模式》

简介:

建造者模式,它是一种对象构建模式,它提供了一种构建对象的最佳方式。这种模式适用于当对象的构建过程需要涉及到多个部分,并且这些部分在构造过程中可以逐步完善。
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式将对象的创建过程抽象化,通过将对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式主要涉及四个角色:
1、产品角色(Product)是一个具体的产品对象,它包含了产品对象的各个部分。
2、抽象建造者(Builder)为创建一个产品对象的各个部件指定抽象接口,它定义了产品对象的各个部分,并提供了一种构建和装配各个部件的方法。
3、具体建造者(ConcreteBuilder)实现抽象建造者接口,构造和装配产品的各个部件,定义并明确它所创建的表示,并提供一个返回这个产品的接口。
4、指挥者(Director)构建一个使用Builder接口的对象。

使用建造者模式可以隔离客户与对象的生产过程,同时负责控制产品对象的生产过程。这种模式使得用户只需要通过指定复杂对象的类型和内容就可以构建它们,而不需要了解内部具体的构建细节。

总的来说,建造者模式是一种灵活且可维护的模式,它使得对象构建过程更加清晰和易于理解。

建造者模式的使用场景:
1、相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用建造者模式。
3、产品类非常复杂,或者产品类中调用顺序不同产生了不同的效果时,可以采用建造者模式。
4、在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式。

建造者模式的创建步骤:
1、创建一个指挥者类,该类负责调用建造者类来构建复杂对象。
2、创建一个抽象建造者类,该类定义了复杂对象的各个部件,以及如何构建这些部件。
3、创建一个具体建造者类,该类实现了抽象建造者类中定义的方法,以构建并返回复杂对象。
4、在客户端代码中,使用指挥者类来创建具体建造者类的实例,然后通过指挥者类来调用具体建造者类的方法,以构建复杂对象。

以上是建造者模式的基本创建步骤,您可以根据实际情况进行调整和扩展。

建造者模式的优点,主要包括:
1、将一个复杂对象的建造过程与其表示过程分离,使得同样的构建过程可以创建不同的表示。
2、客户端不必知道产品对象的内部组成,使得构建过程更加灵活。
3、将复杂对象的创建过程分解在不同的方法中,使得创建过程更加清晰,更方便使用程序来控制创建过程。
4、各个具体建造者相互独立,有利于系统的解耦。
5、指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。

建造者模式的缺点,主要包括:
1、产品的组成部分必须相同,这限制了其使用范围。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。


示例:

一、C#建造者模式

下面是一个使用C#实现建造者模式的示例:

// 产品类  
public class Car  
{  public string Name { get; set; }  public int Seats { get; set; }  public string Transmission { get; set; }  public string Engine { get; set; }  public override string ToString()  {  return $"{Name} ({Seats} seats, {Transmission}, {Engine})";  }  
}  // 抽象建造者类  
public abstract class CarBuilder  
{  public abstract void SetBody();  public abstract void SetWindows();  public abstract void SetDoors();  public abstract Car GetCar();  
}  // 具体建造者类1  
public class CarBuilderA : CarBuilder  
{  private Car _car = new Car();  public override void SetBody()  {  _car.Name = "CarA";  _car.Seats = 4;  _car.Transmission = "Automatic";  _car.Engine = "Petrol";  }  public override void SetWindows()  {  // Add windows to the car body  }  public override void SetDoors()  {  // Add doors to the car body  }  public override Car GetCar()  {  return _car;  }  
}  // 具体建造者类2  
public class CarBuilderB : CarBuilder  
{  private Car _car = new Car();  public override void SetBody()  {  _car.Name = "CarB";  _car.Seats = 2;  _car.Transmission = "Manual";  _car.Engine = "Electric";  }  public override void SetWindows()  {  // Add windows to the car body  }  public override void SetDoors()  {  // Add doors to the car body  }  public override Car GetCar()  {  return _car;  }  
}

二、java建造者模式

建造者模式通常通过以下方式实现:

// 产品类  
public class Car {  private String name;  private int seats;  private String transmission;  private String engine;  public Car(String name, int seats, String transmission, String engine) {  this.name = name;  this.seats = seats;  this.transmission = transmission;  this.engine = engine;  }  public String getName() {  return name;  }  public int getSeats() {  return seats;  }  public String getTransmission() {  return transmission;  }  public String getEngine() {  return engine;  }  
}  // 抽象建造者类  
public abstract class CarBuilder {  public abstract void setBody();  public abstract void setWindows();  public abstract void setDoors();  public abstract Car getCar();  
}  // 具体建造者类1  
public class CarBuilderA extends CarBuilder {  private Car car = new Car("CarA", 4, "Automatic", "Petrol");  @Override  public void setBody() {  // Add body to the car  }  @Override  public void setWindows() {  // Add windows to the car body  }  @Override  public void setDoors() {  // Add doors to the car body  }  @Override  public Car getCar() {  return car;  }  
}  // 具体建造者类2  
public class CarBuilderB extends CarBuilder {  private Car car = new Car("CarB", 2, "Manual", "Electric");  @Override  public void setBody() {  // Add body to the car  }  @Override  public void setWindows() {  // Add windows to the car body  }  @Override  public void setDoors() {  // Add doors to the car body  }  @Override  public Car getCar() {  return car;  }  
}

三、javascript建造者模式

在JavaScript中,建造者实现方式如下:

// 产品类  
function Car(name, seats, transmission, engine) {  this.name = name;  this.seats = seats;  this.transmission = transmission;  this.engine = engine;  
}  // 抽象建造者类  
function CarBuilder() {}  // 具体建造者类1  
function CarBuilderA() {  this.car = new Car();  
}  CarBuilderA.prototype.setBody = function(body) {  // Add body to the car  this.car.name = body;  
};  CarBuilderA.prototype.setWindows = function(windows) {  // Add windows to the car body  this.car.seats = windows;  
};  CarBuilderA.prototype.setDoors = function(doors) {  // Add doors to the car body  this.car.transmission = doors;  
};  CarBuilderA.prototype.getCar = function() {  return this.car;  
};  // 具体建造者类2  
function CarBuilderB() {  this.car = new Car();  
}  CarBuilderB.prototype.setBody = function(body) {  // Add body to the car  this.car.name = body;  
};  CarBuilderB.prototype.setWindows = function(windows) {  // Add windows to the car body  this.car.seats = windows;  
};  CarBuilderB.prototype.setDoors = function(doors) {  // Add doors to the car body  this.car.transmission = doors;  
};  CarBuilderB.prototype.getCar = function() {  return this.car;  
};

四、C++建造者模式

以下是在C++中实现建造者模式:

#include <iostream>  
#include <string>  // 产品类  
class Car {  
public:  void setBody(const std::string& body) {  m_body = body;  }  void setWindows(const std::string& windows) {  m_windows = windows;  }  void setDoors(const std::string& doors) {  m_doors = doors;  }  void printCar() const {  std::cout << "Car: " << m_body << ", Windows: " << m_windows << ", Doors: " << m_doors << std::endl;  }  private:  std::string m_body;  std::string m_windows;  std::string m_doors;  
};  // 抽象建造者类  
class CarBuilder {  
public:  virtual ~CarBuilder() {}  virtual void setBody() = 0;  virtual void setWindows() = 0;  virtual void setDoors() = 0;  virtual Car* getCar() = 0;  
};  // 具体建造者类1  
class CarBuilderA : public CarBuilder {  
public:  void setBody() {  m_car->setBody("CarA Body");  }  void setWindows() {  m_car->setWindows("CarA Windows");  }  void setDoors() {  m_car->setDoors("CarA Doors");  }  Car* getCar() {  return m_car;  }  private:  Car* m_car;  
};  // 具体建造者类2  
class CarBuilderB : public CarBuilder {  
public:  void setBody() {  m_car->setBody("CarB Body");  }  void setWindows() {  m_car->setWindows("CarB Windows");  }  void setDoors() {  m_car->setDoors("CarB Doors");  }  Car* getCar() {  return m_car;  }  private:  Car* m_car;  
};  // 客户端代码  
int main() {  // 使用CarBuilderA构建一辆汽车并输出信息  CarBuilderA builderA;  builderA.setBody();  builderA.setWindows();  builderA.setDoors();  Car* carA = builderA.getCar();  carA->printCar();  
}

五、python建造者模式

在Python中,建造者模式通常使用类来构建对象。下面是一个使用Python实现建造者模式的示例:

class Car:  def __init__(self):  self.body = ""  self.windows = ""  self.doors = ""  def set_body(self, body):  self.body = body  def set_windows(self, windows):  self.windows = windows  def set_doors(self, doors):  self.doors = doors  def print_car(self):  print("Car: {}, Windows: {}, Doors: {}".format(self.body, self.windows, self.doors))  class CarBuilder:  def __init__(self):  self.car = Car()  def set_body(self):  self.car.set_body("Car Body")  def set_windows(self):  self.car.set_windows("Car Windows")  def set_doors(self):  self.car.set_doors("Car Doors")  def get_car(self):  return self.car  # 客户端代码  
if __name__ == "__main__":  builder = CarBuilder()  builder.set_body()  builder.set_windows()  builder.set_doors()  car = builder.get_car()  car.print_car()

六、go建造者模式

在Go语言中,建造者模式通常使用结构体和方法来实现。下面是一个使用Go实现建造者模式的示例:

package main  import "fmt"  // Product接口定义产品的行为  
type Product interface {  Use()  
}  // ConcreteProduct是Product接口的具体实现  
type ConcreteProduct struct {  // 产品的属性  
}  // Use是Product接口的具体实现方法  
func (p *ConcreteProduct) Use() {  fmt.Println("使用产品")  
}  // Builder接口定义构建者的行为  
type Builder interface {  SetPartA()  SetPartB()  SetPartC()  GetProduct() Product  
}  // ConcreteBuilder是Builder接口的具体实现  
type ConcreteBuilder struct {  product *ConcreteProduct  
}  // SetPartA是Builder接口的具体实现方法  
func (b *ConcreteBuilder) SetPartA() {  // 构建产品的部分A  
}  // SetPartB是Builder接口的具体实现方法  
func (b *ConcreteBuilder) SetPartB() {  // 构建产品的部分B  
}  // SetPartC是Builder接口的具体实现方法  
func (b *ConcreteBuilder) SetPartC() {  // 构建产品的部分C  
}  // GetProduct是Builder接口的具体实现方法,返回最终的产品  
func (b *ConcreteBuilder) GetProduct() Product {  return b.product  
}  func main() {  // 创建具体的构建者对象  builder := &ConcreteBuilder{}  // 使用构建者构建产品对象,并使用产品对象的方法进行操作。  builder.SetPartA() 
}

七、PHP建造者模式

下面是一个使用PHP实现建造者模式的示例:

<?php  // 产品接口  
interface Product {  public function useProduct();  
}  // 具体产品实现  
class ConcreteProduct implements Product {  public function useProduct() {  echo "使用产品";  }  
}  // 建造者接口  
interface Builder {  public function setPartA();  public function setPartB();  public function setPartC();  public function getProduct();  
}  // 具体建造者实现  
class ConcreteBuilder implements Builder {  private $product;  public function setPartA() {  // 构建产品的部分A,并进行适当的设置(比如组装或配置)工作。  // 具体细节对用户来说是不可见的。用户只是调用builder的方法进行设置,而不需要关心具体是如何实现的。这就是封装。  // 封装是面向对象编程的三大特性之一,它提供了隐藏对象内部状态并仅通过对象提供的方法来访问的能力。封装可以防止用户直接访问对象内部状态,从而防止修改对象内部状态导致的问题。封装还可以隐藏对象的实现细节,从而提高了代码的安全性和可维护性。  }  public function setPartB() {  // 构建产品的部分B,并进行适当的设置(比如组装或配置)工作。  }  public function setPartC() {  // 构建产品的部分C,并进行适当的设置(比如组装或配置)工作。  }  public function getProduct() {  return $this->product; // 返回最终的产品对象。  }  
}  // 使用建造者模式构建对象并使用其方法进行操作。  
$builder = new ConcreteBuilder();  
$builder->setPartA(); 

《完结》

上一篇《策略模式》                                                        下一篇《适配器模式》

相关文章:

设计模式:建造者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《策略模式》 下一篇《适配器模式》 简介&#xff1a; 建造者模式&#xff0c;它是一种对象构建模式&#xff0c;它提供了一种构建对象的最佳方式。这种模式适用于当对象的构建过程需要涉及到多个部分&#xff…...

Maxon Cinema 4D 2024:打造独一无二的视觉效果 模拟模块大更新

在视觉效果和3D建模领域&#xff0c;Maxon的Cinema 4D一直以其卓越的性能和创新的功能引领着时代潮流。今天&#xff0c;我们很高兴地宣布推出最新版本——Maxon Cinema 4D 2024&#xff08;C4D 2024&#xff09;&#xff0c;它将再次提升行业标准&#xff0c;为设计师提供更强…...

16.2 ARP 主机探测技术

ARP &#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;&#xff0c;是一种用于将 IP 地址转换为物理地址&#xff08;MAC地址&#xff09;的协议。它在 TCP/IP 协议栈中处于链路层&#xff0c;为了在局域网中能够正确传输数据包而设计&#xff0c;…...

三级等保-linux服务器三权分立设置

安全问题 安全控制点 风险分析 风险等级 标准要求 加固建议 服务器未严格按照系统管理员权限、审计管理员权限、安全管理员权限进行分配管理员账户&#xff0c;未实现管理员用户的最小权限划分。 访问控制 可能存在管理员越权操作的风险 中 d)应授予管理用户所需的最…...

抓取网页的含义和URL基本构成

抓取网页是指通过爬虫程序从互联网上获取网页的内容和数据。抓取网页是爬虫的核心功能之一&#xff0c;通过抓取网页&#xff0c;可以获取到网页中的文本、图片、链接等信息&#xff0c;用于后续的数据分析、挖掘和应用。 URL&#xff08;Uniform Resource Locator&#xff09…...

计算机毕业设计 机器学习深度学习人工智能

视频参考&#xff1a; 计算机毕业设计项目分享_哔哩哔哩_bilibili 基于深度学习的农业病虫害识别基于SpringBootVue的博客系统基于SpringBootVue的仓库管理系统基于卷积网络的花卉图像识别 毕业设计选题&#xff1a; VX:whbwqq123 基于机器学习的大气数据的污染物pm2.5预测基…...

施密特正交化

相信大家在平时的期末考试中一定少不了对某某向量组执行标准正交化类型的题目。今天我们从这个题目入手&#xff0c;说明这个如何执行施密特正交化&#xff0c;以及为什么要进行正交化。 一、例子 例子&#xff1a;设 a 1 [ 1 2 − 1 ] a_1\begin{bmatrix}1\\2\\-1\end{bmat…...

低代码开发:加速应用开发的利器

目录 一、引言 二、低代码开发的定义和原理 三、低代码开发的关键特性和优势 四、低代码开发的应用场景 五、低代码开发平台的市场现状和发展趋势 六、成功案例分析 七、结论 一、引言 随着信息技术的快速发展&#xff0c;企业对于应用开发的需求也日益增长。传统的应用…...

数据安全发展趋势与密码保护技术研究

随着数据跃升为新型生产要素&#xff0c;数据安全的内涵也从数据本身安全、数据资源安全&#xff0c;发展到数据资产安全三个层面提出了不同的要求&#xff0c;本文就是详细探讨数据安全的这三个层面的安全内容进行分析。 通过对数据安全不同发展阶段的安全需求和保障对象进行研…...

368周赛leetcode

1 2题元素和最小的山形三元组 经典动规 题目内容 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a; i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 num…...

Vue 的 nextTick:深入理解异步更新机制

目录 一、前言 二、Vue.js 异步更新机制简述 三、Vue.nextTick原理 四、nextTick 的应用场景 1. 获取更新后的 DOM 元素 2. 在 DOM 更新后执行自定义的回调函数 3. 解决事件监听器中的更新问题 五、Vue.nextTick与其他异步更新方法的比较 六、总结 一、前言 Vue.js&a…...

SQL关于日期的计算合集

前言 在SQL Server中&#xff0c;时间和日期是常见的数据类型&#xff0c;也是数据处理中重要的一部分。SQL Server提供了许多内置函数&#xff0c;用于处理时间和日期数据类型。这些函数可以帮助我们执行各种常见的任务&#xff0c;例如从日期中提取特定的部分&#xff0c;计…...

shell_44.Linux使用 getopt 命令

使用 getopt 命令 getopt 命令在处理命令行选项和参数时非常方便。它能够识别命令行参数&#xff0c;简化解析过程 1. 命令格式 getopt 命令可以接受一系列任意形式的命令行选项和参数&#xff0c;并自动将其转换成适当的格式。 getopt 的命令格式如下&#xff1a; getopt opt…...

Linux备份Docker的mysql数据并传输到其他服务器保证数据级容灾

目录 简介什么是容灾 &#xff1f;容灾的分类容灾和备份有什么连系 &#xff1f; 数据级容灾备份步骤1、scp命令&#xff1a;用于Linux之间复制文件和目录2、编写备份数据库脚本3、crontab定时任务执行脚本4、测试 应用级容灾业务级容灾 简介 为了防止客户系统的数据丢失&…...

【vue+nestjs】qq第三方授权登录【超详细】

项目场景&#xff1a; 前端使用vue3ts 后端使用nestjs 1.申请appId,appKey 1.进入qq互联官网。创建应用 特别注意 1.在填写网站回调域时,需要你线上真实能访问的。不然审核不通过。我的回调地址是前端路由地址 2.如果你想本地调试&#xff0c;回调到你的线上地址。你可以在本…...

经典卷积神经网络 - VGG

使用块的网络 - VGG。 使用多个 3 3 3\times 3 33的要比使用少个 5 5 5\times 5 55的效果要好。 VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确…...

系统集成测试(SIT)/系统测试(ST)/用户验收测试(UAT)

文章目录 单元测试集成测试系统测试用户验收测试黑盒测试白盒测试压力测试性能测试容量测试安全测试SIT和UAT的区别 单元测试 英文 unit testing&#xff0c;缩写 UT。测试粒度最小&#xff0c;一般由开发小组采用白盒方式来测试&#xff0c;主要测试单元是否符合“设计”。 …...

Android Gradle8.0以上多渠道写法以及针对不同渠道导入包的方式,填坑!

目录 多渠道的写法 针对多渠道引用不同的包 There was a failure while populating the build operation queue: Could not stat file E:\xxxx\xxxx\xxxx\app\src\UAT\libsUAT\xxx-provider(?)-xx.aar 最近升级了Gradle8.3之后&#xff0c;从Groovy 迁移到 Kotlin&#xff…...

hdlbits系列verilog解答(向量门操作)-14

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 构建一个具有两个 3 位输入的电路&#xff0c;用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的逆 &#xff08;NOT&#xff09;。将b反相输出到out_not上半部分&#xff0c;将a 的反相输出到out…...

工厂模式(初学)

工厂模式 1、简单工厂模式 是一种创建型设计模式&#xff0c;旨在通过一个工厂类&#xff08;简单工厂&#xff09;来封装对象的实例化过程 运算类 public class Operation { //这个是父类private double num1; //运算器中的两个值private double num2;public double getNu…...

MedSAM开源项目:医学图像分割的通用架构创新与实战应用

MedSAM开源项目&#xff1a;医学图像分割的通用架构创新与实战应用 【免费下载链接】MedSAM Segment Anything in Medical Images 项目地址: https://gitcode.com/gh_mirrors/me/MedSAM MedSAM&#xff08;Segment Anything in Medical Images&#xff09;是一个针对医学…...

Blazor与AI原生融合:如何在客户端直接调用ONNX Runtime + ML.NET推理模型(含TensorFlow.js互操作避坑指南)

第一章&#xff1a;Blazor与AI原生融合的范式演进传统Web前端框架长期面临状态同步复杂、服务端耦合度高、实时AI能力接入成本大等瓶颈。Blazor凭借WebAssembly&#xff08;WASM&#xff09;与服务器端SignalR双执行模型&#xff0c;首次为浏览器端提供了可运行强类型.NET代码的…...

M2LOrder情感分析多场景:政务热线投诉文本情绪聚类与热点发现

M2LOrder情感分析多场景&#xff1a;政务热线投诉文本情绪聚类与热点发现 1. 项目概述与核心价值 M2LOrder是一个基于.opt模型文件的情绪识别与情感分析服务&#xff0c;提供HTTP API和WebUI两种访问方式。这个系统特别适合处理政务热线中的大量投诉文本&#xff0c;能够自动…...

技术判断力之AI三问映

认识Pass层级结构 Pass范围从上到下一共分为5个层级&#xff1a; 模块层级&#xff1a;单个.ll或.bc文件 调用图层级&#xff1a;函数调用的关系。 函数层级&#xff1a;单个函数。 基本块层级&#xff1a;单个代码块。例如C语言中{}括起来的最小代码。 指令层级&#xff1a;单…...

3大战略优势:如何通过Axure本地化解决方案提升团队设计效率与协作效能

3大战略优势&#xff1a;如何通过Axure本地化解决方案提升团队设计效率与协作效能 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn …...

Cinema 4D 项目一天就能渲染完?5分钟提交渲染农场任务

很多刚接触 Cinema 4D 云渲染 的用户都会有一个疑问&#xff1a;“我今天能不能马上把项目放到渲染农场渲染&#xff1f;”答案是 可以的。实际上&#xff0c;从注册到提交渲染任务&#xff0c;整个流程通常只需要几分钟。只要你的项目准备好&#xff0c;就可以立即开始渲染。渲…...

英雄联盟终极工具箱:League Akari 完整使用指南与功能解析

英雄联盟终极工具箱&#xff1a;League Akari 完整使用指南与功能解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟客户端的…...

终极指南:使用Scarab轻松管理《空洞骑士》Mods的10个技巧

终极指南&#xff1a;使用Scarab轻松管理《空洞骑士》Mods的10个技巧 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab Scarab是一款专为《空洞骑士》游戏设计的现代化Mod管理器…...

HoRain云--Swift枚举全解析:从基础到高级应用

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...

AI快速生成可编辑的流程图的方法

AI快速生成可编辑的流程图的方法 方法1&#xff1a;使用deepseek直接生成drawio流程图 生成后下载&#xff0c;使用drawio&#xff08;访问地址&#xff1a;https://app.diagrams.net/&#xff09; 打开 在drawio对流程图进行修改和美化。 方法2&#xff1a;使用deepseek生成…...