gRPC源码剖析-Builder模式
一、Builder模式
1、定义
将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的的表示。
2、适用场景
-
当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。
-
当构造过程必须允许被构造的对象有不同的表示时。
说人话:当你要构造一个对象它的参数大于4个尤其是有些参数是必选有些是可选的就可以考虑使用Builder构造模式。
3、Builder模式最简单一个例子
创建一个Person对象,姓名和性别是必须的,年龄和身高等其他属性是可选的,我们有几种方法来创建,第一种是用需要写很多个重载的构造函数,另外一种直接使用JavaBean的set方法但没有办法约束是否必选。下面是使用Builder模式构造的代码。


说明
1、创建一个内部静态类Builder,将对象的属性全部搬一份到Builder中。
2、以必须的属性做为参数创建构造函数
3、创建build方法,将Builder对象作为参数调用主类构造方法
4、主类构造方法以Builder作为参数,然后将Builder的所有属性赋给主类对应的属性。
5、上面代码充斥大量重复的get/set方法,可以用Lombok进行简化,这里先不展开讲了。
4、稍微复杂Builder模式类图

-
Builder:一个抽象接口,以规范产品对象的各个组成成分的建造。
-
ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。
-
Director:调用具体建造者来创建复杂对象的各个部分。
-
Product:要创建的复杂对象。
二、gRPC中Builder模式使用
在gRPC框架中Builder模式使用的比较多,比如启动gRPC这个代码
Server server = ServerBuilder.forPort(50052).addService(new OrderServiceImpl()).build().start();
就是通过ServerBuilder来构建Server对象。UML类图如下

另外gRPC编译生成的gprc桩中也大量使用了Builder模式

关于设计模式的概念对于业务开发人员掌握常用的几种就行(用得最多的是策略模式),但要读懂各底层框架,还是需要对所有设计模式都有所了解,否则很难读得懂源代码,并且好多设计模式加上各种变种容易搞混,似是而非,看似简单掌握起来确不容易,用好更难。
相关文章:
gRPC源码剖析-Builder模式
一、Builder模式 1、定义 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的的表示。 2、适用场景 当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被构造的对象有不同的表示时。 说人话:…...
ARM传输数据以及移位操作
3.2.2 数据传送指令 LDR/STR指令用来在寄存器和内存之间输送数据。如果我们想要在寄存器之间传送数据,则可以使用MOV指令。MOV指令的格式如下。 MOV {cond} {s}Rd, oprand2 MOV {cond} {s}Rd, oprand2 其中,{cond}为条件指令可选项,{s}用来表…...
06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)
1、数据情况: 其一、从后端拿到的数据为: let arr [1,3,6,10,11,23,24] 其二、目标数据为: [{vlan_1: 1, value: 1}, {vlan_3: 3, value: 1}, {vlan_6: 6, value: 1}, {vlan_10: 10, value: 1}, {vlan_11: 11, value: 1}, {vlan_23: 23, v…...
ngx_http_request_s
/* 罗剑锋老师的注释参考: https://github.com/chronolaw/annotated_nginx/blob/master/nginx/src/http/ngx_http_request.h */struct ngx_http_request_s {uint32_t signature; /* "HTTP" */ngx_connection_t …...
Docker 学习路线 2:底层技术
了解驱动Docker的核心技术将让您更深入地了解Docker的工作原理,并有助于您更有效地使用该平台。 Linux容器(LXC) Linux容器(LXC)是Docker的基础。 LXC是一种轻量级的虚拟化解决方案,允许多个隔离的Linux系…...
UEFI实战——显示图片
一、准备工作 1.1 BMP格式图片 参考:BMP格式详解获取“BMP格式详解”文档里的图片,命名为Logo.bmp将Logo.bmp图片放到U盘里,U盘格式FAT32二、实例代码 2.1 代码结构 TextPkg/ ├── Display.c ├── GetFile.c ├── Test.c ├── Test.dsc ├── Test.h └── Tes…...
Ansible中的playbook
目录 一、playbook简介 二、playbook的语法 三、playbook的核心组件 四、playbook的执行命令 五、vim 设定技巧 六、基本示例 一、playbook简介 1、playbook与ad-hoc相比,是一种完全不同的运用。 2、playbook是一种简单的配置管理系统与多机器部署系统的基础…...
怎样去除视频中的杂音,保留人声部分?
怎样去除视频中的杂音,保留人声部分?这个简单嘛!两种办法可以搞定:一是进行音频降噪,把无用的杂音消除掉;二是提取人声,将要保留的人声片段提取出来。 这就将两种实用的办公都分享出来…...
基于Qt QTreeView|QTreeWidget控件使用简单版
头文件解析: 这是一个C++代码文件,定义了一个名为MainWindow的类。以下是对每一句的详细解释: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H ``` 这是一个条件编译指令,用于避免头文件的重复包含。`MAINWINDOW_H`是一个宏定义,用于唯一标识这个头文件。 ```cpp #…...
edge浏览器的隐藏功能
1. edge://version 查看版本信息 2. edge://flags 特性界面 具体到某一特性:edge://flags/#overlay-scrollbars 3. edge://settings设置界面 详情可参考chrome: 4. edge://extensions 扩展程序页面 5. edge://net-internals 网络事件信息 6. edge://component…...
安卓抓包之小黄鸟
下载安装 下载地址: https://download.csdn.net/download/yijianxiangde100/88496463 安装apk 即可。 证书配置:...
Django中的FBV和CBV
一、两者的区别 1、在我们日常学习Django中,都是用的FBV(function base views)方式,就是在视图中用函数处理各种请求。而CBV(class base view)则是通过类来处理请求。 2、Python是一个面向对象的编程语言…...
信息泄露--
大唐电信AC简介 大唐电信科技股份有限公司是电信科学技术研究院(大唐电信科技产业集团)控股的的高科技企业,大唐电信已形成集成电路设计、软件与应用、终端设计、移动互联网四大产业板块。 大唐电信AC集中管理平台存在弱口令及敏感信息泄漏漏…...
C#WPF文本格式化模式实例
本文演示C#WPF文本格式化模式实例 WPF 文本渲染优缺点 WPF中的文本渲染和旧式的基于 GDI的应用程序的文本染有很大区别。很大一部分区 别是由于 WPF 的设备无关显示系统造成的,但 WPF 中的文本染也得到了显著增强,能更清晰地显示文本,在 LCD 监视器上尤其如此。 然而,W…...
嵌入式云平台一些基础概念的理解
1.SDK SDK是Software Development Kit的缩写,译为”软件开发工具包”,通常是为辅助开发某类软件而编写的特定软件包,框架集合等,SDK一般包含相关文档,范例和工具。 我自己的理解就似乎,SDK也就是软件开发工具包,他会为其使用者提供一些封装好的接口&…...
【项目管理】生命周期风险评估
规划阶段目标:识别系统的业务战略,以支撑系统的安全需求及安全战略 规划阶段评估重点:1、本阶段不需要识别资产和脆弱性;2、应根据被评估对象的应用对象、应用环境、业务状况、操作要求等方面识别威胁; 设计阶段目标…...
力扣 搜索旋转排序数组 二分
👨🏫 33. 搜索旋转排序数组 class Solution {public int search(int[] nums, int target){int l 0;int r nums.length - 1;while (l < r){int m l r >> 1;//else大法,把无序段抛给else,if只处理有序段 // 需要特…...
【软件测试】个人博客项目测试报告
目录 1.报告概要 2、测试环境 3、手动测试用例编写 4、自动化测试用例 1.报告概要 测试对象:基于SSM项目的博客系统。 测试目的:检测博客项目是否符合预期,并且对测试知识进行练习和巩固。 测试点:主要针对常用的功能进行测…...
Express框架开发接口之今日推荐等模块
1.初始化 const handleDB require(../handleDB/index) // 获取全部模块 exports.allModule (req, res) > {(async function () {})() } // 更新或者添加模块 exports.upModule (req, res) > {(async function () {})() } // 根据id删除模块 exports.delModule (req, …...
UTONMOS:元宇宙顺势而上,重构数字化发展新形态
元宇宙(Metaverse)是一个虚拟的、且与现实世界平行的虚拟世界,由一系列相互关联的技术组成。在这个虚拟世界中,人们可以通过 VR、 AR等设备进入其中,与虚拟人物进行互动。 随着新一代信息技术的飞速发展,元…...
4.0修复版去水印小程序源码 内含去水印免费接口
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 流量主变现:集成微信广告,支持开屏 / 激励 / Banner 广告,直接盈利。 前后端能力: 前端:3 套 UI 可选,改版后功能完…...
Nodejs开发者三步接入Taotoken,实现异步聊天补全
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Nodejs开发者三步接入Taotoken,实现异步聊天补全 对于使用Node.js进行开发的工程师来说,无论是构建前端应用…...
以灵活测试方案打造共享实验室,强化槟城IC设计生态系统
益莱储(Electro Rent) InvestPenang|IC 设计验证与特性表征共享实验室马来西亚槟城正积极推进其成为亚洲领先的半导体枢纽。在 InvestPenang 主导的「Penang Silicon Design 5KM(PSD5KM)」计划下,全新的 I…...
告别本科论文 “从零焦虑”:okbiye AI 写作如何用 “全流程定制” 终结熬夜改稿循环
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 本科论文写到崩溃,是每个毕业生都懂的痛。 我见过凌晨三点的宿舍走廊,有人对着 Word 文档掉眼泪;也见过…...
Delft3D建模、水动力模拟方法及在地表水环境影响评价中的实践技术应用
一:Delft3D软件介绍及建模原理和步骤对常见的地表水数值模型进行介绍,学习Delft3D软件的构成、界面内容,了解地表水数值模型的建模步骤:1.1地表水数值模拟常用软件介绍EFDC_Explorer(商业) Delft3D…...
使用 Taotoken 管理多个 API Key 并设置访问权限与审计
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken 管理多个 API Key 并设置访问权限与审计 在开发和集成大模型应用时,一个常见的需求是为不同的应用、环境…...
告别高斯模糊!用OpenCV+Python手把手实现引导滤波,保留图像边缘细节(附完整代码)
边缘保持滤波新选择:OpenCV与Python实现引导滤波实战指南 在数字图像处理领域,平滑滤波与边缘保持一直是一对难以调和的矛盾。传统的高斯滤波虽然能有效去除噪声,却常常以牺牲图像细节为代价;双边滤波虽然在一定程度上解决了边缘保…...
HTML到DOCX格式转换的技术实现与解决方案
HTML到DOCX格式转换的技术实现与解决方案 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在Web应用开发和企业文档处理流程中,HTML内容与Office文档格式之间的转换一直是一个技术难点。传…...
OpCore-Simplify:开源系统硬件适配的自动化配置引擎
OpCore-Simplify:开源系统硬件适配的自动化配置引擎 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在跨平台系统部署领域,硬件…...
ElevenLabs波兰语语音突然失真?3类高频报错代码+实时调试日志解析(含波兰语IPA音素校验表)
更多请点击: https://codechina.net 第一章:ElevenLabs波兰语语音失真现象的系统性定位 ElevenLabs 的 TTS 服务在处理波兰语时,部分用户报告出现音素断裂、重音偏移及辅音簇(如 szcz、 żdź)发音模糊等失真现象。此…...
