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

深入探索仓颉编程语言:函数与结构类型的终极指南

引言

仓颉编程语言是一种现代化、语法精炼的编程语言,其设计目标是提供高度的灵活性与高性能的执行效率。函数与结构类型是仓颉语言的两大基础模块,也是开发者需要掌握的核心。本文将详细讲解仓颉语言中函数和结构类型的特性,辅以代码实例和解释,帮助读者深入理解其强大功能。


第一部分:函数

1.1 定义函数

仓颉语言允许多种风格的函数定义方式,支持显式参数类型和自动类型推导。

示例 1:基本函数定义
// 一个简单的求和函数
fn add(a: int, b: int) -> int {return a + b;
}// 自动类型推导
fn greet(name) {print("Hello, " + name);
}
解释:
  • 第一个函数 add 显式指定了参数类型 int 和返回值类型 int
  • 第二个函数省略了参数类型,仓颉编译器会根据调用时的上下文自动推导类型。

1.2 调用函数

调用函数十分直观,无需额外的语法糖,支持位置参数与命名参数调用。

示例 2:函数调用
fn multiply(a: int, b: int) -> int {return a * b;
}let result = multiply(10, 20); // 位置参数调用
print(result);
解释:
  • 通过 multiply(10, 20) 调用函数时,将 1020 传入 ab
  • 使用 let 关键字保存返回结果。

1.3 函数重载

仓颉语言支持基于参数类型和数量的函数重载,这增强了函数的可读性和灵活性。

示例 3:函数重载
// 重载函数
fn display(value: int) {print("Integer: " + value);
}fn display(value: string) {print("String: " + value);
}display(42);      // 输出: Integer: 42
display("Hello"); // 输出: String: Hello
解释:
  • 重载函数 display 接受不同的参数类型(intstring)。
  • 编译器会根据参数类型自动选择合适的函数。

1.4 嵌套函数

仓颉语言允许在函数内部定义嵌套函数,用于实现局部逻辑封装。

示例 4:嵌套函数
fn outer_function(x: int) -> int {fn inner_function(y: int) -> int {return y * y;}return inner_function(x) + x;
}print(outer_function(5)); // 输出: 30 (5*5 + 5)
解释:
  • inner_functionouter_function 的局部函数,仅能在 outer_function 内部使用。
  • 嵌套函数通常用于封装辅助逻辑,避免命名污染。

1.5 Lambda 表达式

Lambda 表达式是一种轻量化的匿名函数,常用于简化代码。

示例 5:Lambda 表达式
let square = |x| x * x;
print(square(4)); // 输出: 16// 高阶函数示例
fn operate(a: int, b: int, func) -> int {return func(a, b);
}let add = |x, y| x + y;
print(operate(5, 3, add)); // 输出: 8
解释:
  • |x| x * x 定义了一个接受参数 x 的匿名函数。
  • Lambda 表达式可以作为参数传递给其他函数,从而实现高阶函数。

1.6 闭包

闭包是可以捕获其外部作用域变量的函数。

示例 6:闭包示例
fn counter() -> fn() -> int {let count = 0;return fn() -> int {count += 1;return count;};
}let my_counter = counter();
print(my_counter()); // 输出: 1
print(my_counter()); // 输出: 2
解释:
  • 闭包 fn() -> int 捕获了外部作用域的变量 count
  • 每次调用闭包时,count 的值都会递增。

1.7 const 函数和常量求值

仓颉语言支持 const 函数,用于在编译期执行计算,提高效率。

示例 7:const 函数
const fn factorial(n: int) -> int {return if n <= 1 { 1 } else { n * factorial(n - 1) };
}const result = factorial(5);
print(result); // 输出: 120
解释:
  • const 函数 factorial 在编译期完成计算,因此运行时无需重复计算。

第二部分:结构类型

2.1 定义 struct 类型

结构类型是仓颉语言中用于组合数据的核心方式。

示例 8:定义和实例化 struct
struct Point {x: int,y: int,
}let p1 = Point { x: 10, y: 20 };
print(p1.x); // 输出: 10
解释:
  • Point 是一个结构类型,包含两个字段 xy
  • 使用 {} 创建结构实例。

2.2 mut 函数与可变结构

仓颉语言允许使用 mut 关键字标记可变字段,从而修改结构内容。

示例 9:mut 函数
struct Counter {value: int,
}impl Counter {fn increment(mut self) {self.value += 1;}
}let mut c = Counter { value: 0 };
c.increment();
print(c.value); // 输出: 1
解释:
  • 使用 mut 标记结构实例 c 为可变。
  • increment 函数修改了结构的字段。

2.3 嵌套结构与方法

支持结构的嵌套定义与方法扩展。

示例 10:嵌套结构
struct Circle {center: Point,radius: int,
}fn area(circle: Circle) -> float {return 3.14 * circle.radius * circle.radius;
}let c = Circle { center: Point { x: 0, y: 0 }, radius: 5 };
print(area(c)); // 输出: 78.5
解释:
  • Circle 嵌套了 Point 类型,实现了多层数据组合。
  • 通过方法 area 计算圆的面积。

2.4 高级功能:泛型结构

仓颉语言支持泛型结构,用于定义通用的数据类型。

示例 11:泛型结构
struct Box<T> {value: T,
}let int_box = Box { value: 42 };
let str_box = Box { value: "Hello" };print(int_box.value); // 输出: 42
print(str_box.value); // 输出: Hello
解释:
  • 泛型 T 允许 Box 结构存储任意类型的数据。
  • 泛型提升了代码的复用性。

:总结

本文深入剖析了仓颉编程语言的基础数据类型及其高级用法,并通过代码示例展示了每种类型的实际应用场景。希望读者能够通过本文掌握仓颉语言的核心思想,并在实践中灵活运用,构建高效优雅的应用程序。

通过以上步骤,相信你已经初步了解了仓颉编程语言的安装和使用。从认识到安装,再到运行第一个程序,这种逐步深入的过程帮助我们感受到仓颉语言的简洁和高效。接下来,你可以尝试编写更复杂的程序,探索仓颉语言的更多功能,例如其高级的函数式编程支持、模块化开发机制和丰富的标准库。如果有什么不懂的,可以私信小编哦!
当然了你如果想和我一起学习仓颉编程这门新语言的话,可以点这里进行深入学习仓颉学习

相关文章:

深入探索仓颉编程语言:函数与结构类型的终极指南

引言 仓颉编程语言是一种现代化、语法精炼的编程语言&#xff0c;其设计目标是提供高度的灵活性与高性能的执行效率。函数与结构类型是仓颉语言的两大基础模块&#xff0c;也是开发者需要掌握的核心。本文将详细讲解仓颉语言中函数和结构类型的特性&#xff0c;辅以代码实例和…...

010-spring-后置处理器(重要)

org.mybatis.spring.mapper.MapperScannerConfigurer...

SQL实现新年倒计时功能

马上就到 2025 年了&#xff0c;给大家分享一个使用 SQL 实现的新年倒计时功能。 以下是 PostgreSQL 语法&#xff1a; DO $$ DECLAREdiff INTERVAL; BEGINRAISE NOTICE 2025新年倒计时开始&#xff1a;;LOOP-- 计算当前时间距离2025年的时间间隔diff age(timestamp 2025-01…...

list模拟实现

目录 节点结构 构造函数 insert erase push_back push_front pop_front pop_back 拷贝构造 析构函数 赋值重载 正向迭代器实现 clear 反向迭代器实现 测试list 附完整代码 参照数据结构篇: 带头双向循环链表 节点结构 namespace dck {template <class T&g…...

JVM【Java虚拟机】基础知识(五)

1. 双亲委派机制 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题。 &#x1f4a1;双亲委派机制有什么用&#xff1f; 1.保证类加载的安全性 通过双亲委派机制避免恶意代码替换JDK中的核心类库&#xff0c;比如java.lang.Str…...

阿尔萨斯(JVisualVM)JVM监控工具

文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff…...

Vue BPMN Modeler流程图

1、参考地址 git clone https://github.com/evanyangg/vue-bpmn-modeler.git 2、安装bpmn.js npm install bpmn-js --save 3、使用bpmn.js <template><div class"containers"><div class"canvas" ref"canvas"></div&g…...

python通过正则匹配SQL

pattern r"(?:[^;]|(?:\\.|[^])*);" sql_list [match.group().strip() for match in re.finditer(pattern, execute_sql) if match.group().strip()]for sql in sql_list:print(sql)(?:[^;]|(?:\\.|[^])*); 匹配 连续的非分号内容 或 单引号包裹的字符串&#…...

设置首选网络类型以及调用Android框架层的隐藏API

在Android SDK中提供的framework.jar是阉割版本的&#xff0c;比如有些类标记为hide&#xff0c;这些类不会被打包到这个jar中&#xff0c;而有些只是类中的某个方法或或属性被标记为hide&#xff0c;则这些类或属性会被打包到framework.jar&#xff0c;但是我们无法调用&#…...

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

大家好&#xff0c;我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f; 1000道 …...

如何保证mysql数据库到ES的数据一致性

1.同步双写方案 在代码中对数据库和ES进行双写操作&#xff0c;确保先更新数据后更新ES。 优点&#xff1a; 数据一致性&#xff1a;双写策略可以保证在MySql和Elasticsearch之间数据的强一致性&#xff0c;因为每次数据库的变更都会在Elasticsearch同步反映。实时性&#xf…...

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…...

红黑树 Red-Black Tree介绍

1. 红黑树的定义 红黑树是一种具有如下性质的二叉搜索树&#xff1a; 每个节点是红色或黑色。根节点是黑色。所有叶子节点都是黑色的空节点&#xff08;NIL节点&#xff09;&#xff0c;即哨兵节点。如果一个节点是红色&#xff0c;那么它的子节点一定是黑色。&#xff08;不存…...

我的创作纪念日—致敬未来的自己

机缘 为什么想去写文章呢&#xff1f; 1、想把自己学的知识和技能做一个总结。 2、想给多年后的自己留下一些财富。 3、希望自己分享的知识和经验也能帮到其他有需要的人 收获 在创作的过程中都有哪些收获&#xff1f; 1、每次对知识的总结&#xff0c;都让我的技能更加的…...

Android Studio IDE环境配置

​需要安装哪些东西&#xff1a; Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装&#xff0c;需要注意下安装的路径Android Studio插件…...

matlab中的cell

在MATLAB中&#xff0c;cell 是一种非常重要的数据类型&#xff0c;它能够存储不同类型和大小的数据&#xff0c;这使得它非常灵活&#xff0c;适用于处理复杂的数据结构。 1. 基本介绍 cell 类型的变量可以存储不同类型的数据&#xff0c;如数值、字符、结构体、甚至其他的 …...

Vue项目中env文件的作用和配置

在实际项目的开发中&#xff0c;我们一般会经历项目的开发阶段、测试阶段和最终上线阶段&#xff0c;每一个阶段对于项目代码的要求可能都不尽相同&#xff0c;那么我们如何能够游刃有余的在不同阶段下使我们的项目呈现不同的效果&#xff0c;使用不同的功能呢&#xff1f;这里…...

基于致远OA+慧集通平台的企业主数据管理设计方案(一)

目标 1、实现集团组织主数据的集中统一管理&#xff0c;包括到主数据在致远中的审批新增、编辑、分发等操作&#xff1b; 2、实现集团用户系统权限的集中管理&#xff0c;统一在致远平台中为用户配置各系统中的权限&#xff0c;配置完成后&#xff0c;可以自动或手动的分发到…...

vue前端实现同步发送请求,可设置并发数量【已封装】

新建 TaskManager.js export default class TaskManager {constructor(maxConcurrentTasks 1) {// 最大并发任务数// to do// 并发任务数大于1 接口开始有概率返回空值&#xff0c;推测是后端问题this.maxConcurrentTasks maxConcurrentTasks;this.currentTasks 0;this.tas…...

vue3使用vant日历组件(calendar),自定义日历下标的两种方法

在vue3中使用vant日历组件&#xff08;calendar&#xff09;自定义下标的两种方法&#xff0c;推荐使用第二种&#xff1a; 日期下方加小圆点&#xff1a; 一、使用伪元素样式实现(::after伪元素小圆点样式会被覆盖&#xff0c;只能添加一个小圆点) 代码如下&#xff08;示例…...

Java线程池面试题

为什么要用线程池 降低资源消耗&#xff1a;通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度&#xff1a;当任务到达时&#xff0c;任务可以不需要等到线程创建就能立即执行方便管理线程&#xff1a;线程是稀缺资源&#xff0c;如果无条件地创建&#xff0…...

我的 2024 年终总结

2024 年&#xff0c;我离开了待了两年的互联网公司&#xff0c;来到了一家聚焦教育机器人和激光切割机的公司&#xff0c;没错&#xff0c;是一家硬件公司&#xff0c;从未接触过的领域&#xff0c;但这还不是我今年最重要的里程碑事件 5 月份的时候&#xff0c;正式提出了离职…...

Mysql8 数据库安装及主从配置

一、MySQL8 安装 下载 MySQL 8 的安装包并将其上传到服务器。将安装包解压到指定的目录&#xff0c;例如 /opt/mysql8。创建一个名为 mysql 的用户组和一个名为 mysql 的用户&#xff0c;并将用户添加到组中。同时&#xff0c;设置用户密码并更改用户的主目录和默认 shell。配…...

Unity中UGUI的Button动态绑定引用问题

Unity中UGUI的Button动态绑定引用问题 问题代码修改代码如下总结 问题代码 Button动态绑定几个连续的按钮事件时使用for循环的i做按钮的id发现按钮点击对应不上。如下代码 for (int i 0; i < 10; i) {btn[i].onClick.AddListener(() >{Click(i);}); }/// <summary&…...

测试基础之测试分类

软件测试是确保软件产品满足预期功能、性能和用户体验要求的关键环节。它的主要目的是通过系统化的方法发现并修复软件中的缺陷&#xff0c;从而提高软件的质量和可靠性。在软件开发生命周期的不同阶段执行测试&#xff0c;以尽早发现潜在的错误或类型&#xff0c;早期发现缺陷…...

VS2022 中的 /MT /MTd /MD /MDd 选项

我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…...

socket.io

import { ref } from "vue" import io from "socket.io-client" import { getToken } from "./auth" const socket ref(null) const serverUri import.meta.env.VITE_APP_API_URL// 你的服务器地址 // const serverUri "http://172.16.3…...

latex常见问题汇总

文章目录 单行多图显示双栏插入图片 单行多图显示 \begin{figure}[t!] % case 1\centering\setlength{\tabcolsep}{0.5pt} % 图片之间的距离为0.5 point\begin{tabular}{ccc}\includegraphics[width0.30\linewidth, height0.33\linewidth]{pic/xuLun/thin.png} &\includeg…...

从数据到决策:如何利用多维度交叉分析提升企业整体效能

随着“GenAI”技术的崛起&#xff0c;数据分析在各行各业的应用也发生了深远的变化。IDC中国的调研数据显示&#xff0c;68%的企业在落地GenAI应用时认为&#xff0c;梳理和整合内部数据资产是首要任务&#xff1b;66%的企业则表示&#xff0c;搭建数据湖等数据底座是推动智能化…...

Nmap基础入门及常用命令汇总

Nmap基础入门 免责声明&#xff1a;本文单纯分享技术&#xff0c;请大家使用过程中遵守法律法规~ 介绍及安装 nmap是网络扫描和主机检测的工具。作为一个渗透测试人员&#xff0c;必不可少的就是获取信息。那么nmap就是我们从互联网上获取信息的途径&#xff0c;我们可以扫描互…...

【gopher的java学习笔记】spring web接口404了怎么办

今天新搭了一个spring boot带spring web的工程&#xff0c;不得不说&#xff0c;这java的生态是比golang要齐全一点&#xff0c;各种脚手架工程应有尽有。 因为我们的目标是有个web service&#xff0c;所以spring boot的工程搭好之后&#xff0c;就寻思着给这个spring应用添加…...

constexpr 的概念及用途

constexpr 的概念及用途 constexpr 是 C11 引入的关键字&#xff0c;用于定义常量表达式。常量表达式是指在编译时能够求值的表达式&#xff0c;也就是说&#xff0c;constexpr 用来标识那些编译器在编译时就可以计算结果的变量、函数或对象。 constexpr 在 C 中非常重要&…...

开放世界目标检测 Grounding DINO

开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器&#xff0c;它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术&#xff0c;实现了可以根据人类输入&#xff08;如类别名称或指代表达&#xff09;检测任意对象的功…...

【Spring】基于XML的Spring容器配置—— <import>标签的使用

Spring容器是Spring框架的核心部分&#xff0c;负责管理应用程序中的对象及其生命周期。Spring容器的配置方式有多种&#xff0c;其中基于XML的配置方式仍然被广泛使用&#xff0c;尤其是在一些老旧项目中。本文将详细介绍Spring容器配置中的<import>标签的使用&#xff…...

GemPy 3 地质建模快速入门指南

GemPy 3简介 GemPy 3是一款基于Python的开源三维结构地质建模软件。 GemPy 3由德国的Terranigma Solutions公司维护&#xff0c;并在GitHub上进行开源开发。它允许用户从界面和方向数据中自动创建复杂的地质模型&#xff0c;并支持随机建模以解决参数和模型不确定性问题。新版…...

智慧农业物联网传感器:开启农业新时代

在当今科技飞速发展的时代&#xff0c;农业领域正经历着一场前所未有的变革&#xff0c;而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”&#xff0c;悄然渗透到农业生产的各个环节&#xff0c;为传统农业注入了全新的活力&#xff0c;让农业生产…...

Spring Boot应用开发实战:从入门到精通

一、Spring Boot 简介 1.1 什么是 Spring Boot&#xff1f; Spring Boot 是一个开源框架&#xff0c;旨在简化新 Spring 应用的初始搭建以及开发过程。它构建在 Spring 框架之上&#xff0c;利用了 Spring 的核心特性&#xff0c;如依赖注入&#xff08;Dependency Injection&…...

salesforce Controlled by Parent 的对象如何实现部分情况 Parent可见,但是 该对象不可见

在 Salesforce 中&#xff0c;设置对象的访问控制为“Controlled by Parent”时&#xff0c;该对象的可见性通常由其主对象&#xff08;Parent&#xff09;的共享规则或权限决定。如果主对象可见&#xff0c;子对象也会自动继承可见性。然而&#xff0c;有时候我们希望实现一些…...

React 第二十节 useRef 用途使用技巧注意事项详解

简述 useRef 用于操作不需要在视图上渲染的属性数据&#xff0c;用于访问真实的DOM节点&#xff0c;或者React组件的实例对象&#xff0c;允许直接操作DOM元素或者是组件&#xff1b; 写法 const inpRef useRef(params)参数&#xff1a; useRef(params)&#xff0c;接收的 …...

TCP/IP 邮件

TCP/IP邮件是互联网通信中非常重要的应用之一。当我们发送电子邮件时&#xff0c;我们实际上并没有直接使用TCP/IP协议&#xff0c;而是通过电子邮件程序&#xff0c;例如微软的Outlook、莲花软件的Notes或Netscape Communicator等来实现。这些电子邮件程序背后使用了不同的TCP…...

前缀和与差分

目录 前缀和 一维前缀和 二维前缀和 差分 一维差分 二维差分 进阶练习NOIP普及组与提高组 前缀和 前缀和是一种思想&#xff0c;代码短小精悍是它的特点。相比于数据较大时的从头至尾遍历和优化过的双指针方法来求区间和&#xff0c;前缀和在对于数据进行处理的速度上有…...

2024国赛A问题5

问题五 龙头最大速度优化模型的建立 问题五在问题四的曲线的基础上对速度进行了约束&#xff0c;即在逐步改变龙头速度的情况下&#xff0c;各个龙身的速度也会依次改变&#xff0c;给出龙头的最大行进速度,使得舞龙队各把手的速度均不超过 2 m/s。即可依此构建一个龙头速度的…...

香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443

一、问题 如图&#xff1a; 接上调试串口&#xff0c;每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅&#xff0c;有一位博主提到&#xff0c;但是没有细说解决方案&#xff1a; spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…...

MySQL 常用程序介绍

以下是一些常用的MySQL程序&#xff1a; 程序名作⽤mysqldMySQL的守护进程即 MySQL 服务器&#xff0c;要使⽤MySQL 服务器 mysqld必须正在运⾏状态mysql MySQL客⼾端程序&#xff0c;⽤于交互式输⼊ SQL 语句或以批处理模式从⽂件执⾏SQL的命令⾏⼯具 mysqlcheck⽤于检查、修…...

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)

DevOps实战&#xff1a;用Kubernetes和Argo打造自动化CI/CD流程&#xff08;1&#xff09; 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点&#xff0c;并基于Argo搭建一套完整的DevOps CI/CD服务平台&#xff0c;包括Argo CD…...

RBAC模型

RBAC模型 1.概念 RBAC&#xff1a;role based access control&#xff0c;基于角色的权限控制 三个主体 - 用户 - 角色 - 权限 授权的本质是对用户授权角色&#xff0c;假设系统的用户数量特别多的话可以对用户设置用户组。 2.RBAC表基本设计 用户表 角色表 权限表 …...

CultureLLM 与 CulturePark:增强大语言模型对多元文化的理解

本文介绍团队刚刚在加拿大温哥华召开的顶会NeurIPS 2024上发表的两篇系列工作&#xff1a;CultureLLM 和CulturePark。此项研究以生成文化数据并训练文化专有模型为主要手段&#xff0c;旨在提升已有基础模型的多文化理解能力&#xff0c;使得其在认知、偏见、价值观、在线教育…...

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…...

redis cluster集群

华子目录 什么是redis集群redis cluster的体系架构什么是数据sharding&#xff1f;什么是hash tag集群中删除或新增节点&#xff0c;数据如何迁移&#xff1f;redis集群如何使用gossip通信?定义meet信息ping消息pong消息fail消息&#xff08;不是用gossip协议实现的&#xff0…...

设计模式从入门到精通之(二)抽象工厂模式

抽象工厂模式&#xff1a;不同工厂背后的协作秘密 在上一期中&#xff0c;我们聊到了工厂模式&#xff0c;讲述了如何用一家咖啡店来帮我们制作不同类型的咖啡。那么&#xff0c;如果你不仅需要咖啡&#xff0c;还需要配套的甜品&#xff0c;比如蛋糕或饼干&#xff0c;这时应该…...