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

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模式

关于设计模式的概念对于业务开发人员掌握常用的几种就行(用得最多的是策略模式),但要读懂各底层框架,还是需要对所有设计模式都有所了解,否则很难读得懂源代码,并且好多设计模式加上各种变种容易搞混,似是而非,看似简单掌握起来确不容易,用好更难。

相关文章:

  • 0基础学习PyFlink——事件时间和运行时间的窗口
  • 【二、http】go的http基本请求设置(设置查询参数、定制请求头)get和post类似
  • Java基础之类型(内涵面试题)
  • nodemon : 无法加载文件 C:\Users\XXX\\npm\nodemon.ps1,因为在此系统上禁止运行脚本。
  • 《研发效能(DevOps)工程师》课程简介(三)丨IDCF
  • WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  • 单点登录。
  • 矢量图形设计软件:Illustrator 2024(AI)中文激活版
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II
  • 【LeetCode刷题-链表】--1290.二进制链表转整数
  • 在 Python 中创建奇数列表
  • 【Java】多线程案例(单例模式,阻塞队列,定时器,线程池)
  • stm32 ADC
  • leetcode做题笔记211. 添加与搜索单词 - 数据结构设计
  • vr煤矿掘进机事故模拟救援减少实际工作中的失误-深圳华锐视点
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Flex布局到底解决了什么问题
  • golang中接口赋值与方法集
  • JavaScript 奇技淫巧
  • node学习系列之简单文件上传
  • React-flux杂记
  • React-redux的原理以及使用
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redis在Web项目中的应用与实践
  • 安装python包到指定虚拟环境
  • 大主子表关联的性能优化方法
  • 力扣(LeetCode)357
  • 自动记录MySQL慢查询快照脚本
  • 函数计算新功能-----支持C#函数
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(智能家居界面-界面切换)
  • (02)vite环境变量配置
  • (1)Nginx简介和安装教程
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4)事件处理——(7)简单事件(Simple events)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (四)鸿鹄云架构一服务注册中心
  • (转)程序员技术练级攻略
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *Django中的Ajax 纯js的书写样式1
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .net中我喜欢的两种验证码
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /var/lib/dpkg/lock 锁定问题
  • [Angular] 笔记 18:Angular Router
  • [asp.net core]project.json(2)
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [Flex][问题笔记]TextArea滚动条问题
  • [hive] sql中distinct的用法和注意事项
  • [IE编程] IE中使网页元素进入编辑模式
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [Linux]创建新用户并授予root权限
  • [one_demo_18]js定时器的示例