设计模式-到底什么是builder模式

news2025/1/21 22:05:59

我们来看一个一些常见的开源代码中带builder字样的经典类:

(jdk)Stringbuilder

(spring)springApplicationBuilder

(es)xxxQuerybulider

如果只去看这些类的话,应该是一团乱码,估计总结提取不出来,什么是builder模式。还是从头开始

下图,是一些经典的builder模式的图。能想到,跟上面三个类有啥关系吗?

这些示例图,如果再完善一下的话,大家应该会更清晰。

1,在prouct类中,应该有partA,partB,partC,这三个私有属性。

2,在Concretebuilder类中,应该还有一个返回product实例的方法build():Product。

3,在Concretebuilder类中,这几个buildpart方法,可以没有返回值,但是其实更多的情况是返回了对象本身。以至于,可以连续调用。buildPartA().buildPartB().build()

这样,就跟我们的一些常见类給对上了。

那么builder模式这种方式解决了哪些问题?(即应用场景)

网上的解释,以及书上的解释都很多。尤其是一些架构级别的书中,更是写的让人摸不着头脑。

请华大学《系统设计师教程》一书中,描述一下情况,应该使用builder模式:

“·创建复杂对象的算法独立于组成对象的部分,以及这些部分的集合方式。

·构造过程必须允许已构建对象有不同的表示。”

真心看不懂,但是我的理解就是,一个类中,有多个可选属性的情况,就会造成创建对象的算法很复杂,例如user类中,有name,age,height,sex,address,phone等可选的属性。我们应用程序中要构建这些类,如果通过构造方法的话,可以写太多的构造方法了。User(name,age,height,sex,address,phone),可能有些属性暂时没有或者不需要,少传一些属性,或者交换一些属性排序,就又要提供不同的构造函数。当然,我们是否可以使用set方法呢?也可以,但是基本也是要一大串set方法。

所以我们专门用一个构造类,独立于组成对象的部分,UserBuilder,其中提供.name(String name)方法,.age()方法,height()方法等,都是去初始化部分对象属性,同时返回构造器本身,方便链式调用局部构造方法。最后,使用.build()或者.creatUser()等方法,获取之前生成和局部构造了部分属性的实例。这一部分也表示“允许已构建对象有不同的表示”

那构造器的抽象接口Abstract Bulider和Director类呢?起什么作用呢?

其实在越来越常见的使用中,Abstract Bulider和Director已经被越来越弱化了。因为着两个确实起到的提升整个模式优化的能力并不是那么的明显。你们看一下,其他博客上的写的一些代码示例,什么生产车,生产手机的代码示例,就知道其实Abstract Bulider和Director这两个用途不太大(当然也可能是我自己没有遇到类是的这两个类起很重要作用的场景,如果有读者遇到了,欢迎批评指正)。所以被很多开源方法中,就弱化或者没有再使用Abstract Bulider和Director了,也遇到了其他一些开源代码,好像是使用了director类,但其实又有点四不像,整个模型交互也不太像。所以更常见的反而是阉割版的builder模式吧。

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

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

相关文章

【Kotlin】字符串操作 ① ( 截取字符串函数 substring | 拆分字符串函数 split | 解构语法特性 )

文章目录一、截取字符串函数 substring二、拆分字符串函数 split一、截取字符串函数 substring Kotlin 中提供了 截取字符串函数 substring , 可接收 IntRange 类型的参数 , 这是 整数范围 类型 ; 截取字符串函数 substring 函数原型为 : /*** 返回由给定的[range]索引指定的…

【pat】网红点打卡攻略【图】

一个旅游景点,如果被带火了的话,就被称为“网红点”。大家来网红点游玩,俗称“打卡”。在各个网红点打卡的快(省)乐(钱)方法称为“攻略”。你的任务就是从一大堆攻略中,找出那个能在…

【MyBatis】第一篇:初体验

还是老规矩看一下百度百科中的解释: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c…

Web(三)

JavaScript基础概念:一门客户端脚本语言* 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎* 脚本语言:不需要编译,直接就可以被浏览器解析执行了功能:* 可以来增强用户和html页面的交互过程,可以来控制…

蓝桥杯C51

#include "reg52.h"sfr AUXR 0x8e; //定义辅助寄存器sbit S5 P3^2; //定义按键S5引脚 sbit S4 P3^3; //定义按键S4引脚unsigned char count 0; //定义中断计数器 unsigned char t_h 0; //定义运行时间的变量 unsigned char t_m 0; …

Struts2之OGNL表达式

Struts2之OGNL表达式1、什么是OGNL表达式2、OGNL表达式的作用3、值栈与OGNL3.1、值栈3.2、OGNL访问值栈4、类型转换4.1、类型转换的意义4.2、内置的类型转换器4.3、自定义类型转换器4.3.1、创建日期转换器4.3.2、配置转换器4.3.3、页面4.3.4、实体类和Action控制器4.3.5、strut…

从0到1完成一个Vue后台管理项目(七、Header、Footer、页面布局)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

2010-2020年和讯网分行业社会责任指数

2010-2020年和讯网分行业社会责任指数 1、时间:2010-2020年 2、行业包括: 银行业(III)、人寿保险(III)、普通金融服务、工业运输、采矿业、饮料、不动产、食品与药品零售、电力(III&#xff…

JS字符串的截取出现的bug

前言 在js中我们对字符串进行一部分截取,可以使用slice()函数截取,也可以直接用substring()函数来截取,但是截取也有可能出bug const str小𠮷和小𧨁今天吃了50块钱的KFC console.log(str.slice(0,5)); 可以在控制台看…

ESP-IDF:数组为空异常处理例程

1.需要开启对ESP-IDF 中的 C 异常的支持。 默认情况下禁用对 ESP-IDF 中的 C 异常的支持,但可以使用 CONFIG_CXX_EXCEPTIONS 选项启用. 如果禁用对 ESP-IDF中的 C 异常的支持这样编译例程会报错: error: exception handling disabled, use -fexceptions to enable…

node.js中的文件读取写入操作

fs文件系统模块 什么是fs文件系统模块 fs模块是node.js官方提供的、操作文件的模块。通过fs模块可以实现对文件的读取以及写入操作。 例如: fs.readFile():用于读取指定文件的文件内容fs.writeFile():用于向指定的文件写入内容 引入fs模块&#xff…

[2023] NAND闪存及控制器的市场趋势

一、NAND闪存市场分析据欧洲知名半导体分析机构Yole发布的报告显示,2020年起,NAND闪存市场发展趋势保持稳定增长,2021年,NAND闪存市场份额达到了近670亿美元(见图1),同年,NAND闪存总…

使用 Vagrant 对 VirtualBox 虚拟机磁盘扩容

使用Vagrant 对 VirtualBox 磁盘扩容 Vagrant 下载地址: https://www.vagrantup.com/downloads.html Vagrant版本 2.3.4 VirtualBox版本:7.0.4 1、在初次使用 Vagrant init 创建 VirtualBox 虚拟机时,会创建一个 Vagrantfile 文件 2、在 Vagrantfile…

CAS:60842-46-8;葡聚糖-荧光素;Dextran-FITC

Dextran-FITC、葡聚糖-荧光素、(葡聚糖-FITC) CAS NO: 60842-46-8 英文名称:: Dextran(3,6dihydroxy-3-oxospiro(isobenzofuran-1(3H],9-[9H]xanthen]-5(or 6]-yl]carbamothioate, average Mw of approximately 分子量&#xf…

java 微服务之docker基础入门 docker部署 镜像相关命令 容器命令 数据卷 DockerCompose Docker镜像仓库

初识Docker 项目部署的问题 什么是Docker 不同环境的操作系统不同,Docker如何解决?我们先来了解下操作系统结构 Docker与虚拟机 虚拟机是在一个系统内,运行另外一个系统 镜像和容器 镜像(Image):Docker将…

基于STM32 STC15和SU-03T离线语音模块的智能语音自拍器设计

一. 系统设计及框图 现在的自拍系统有很多是蓝牙控制的,我们这次介绍的是使用语音控制的拍照系统。 本系统通过MCU产生20kHZ左右的频率驱动蜂鸣器(占空比为50%即可),手机APP收到此特定频率的信号后会执行相应的拍照或切换镜头的…

Spring 响应式编程,真香!!!

一、前言 响应式编程是啥?为啥要有响应式编程?响应式流的核心机制是什么?Spring 响应式编程能解决我们平时开发的什么痛点?Spring 响应式编程有哪些应用场景?Spring 响应式编程未来的趋势如何? 开篇六连问…

必要条件和充分条件与分析问题的方法

作为一名软件工程师,大部分的工作时间都是在解决各种问题中度过的,相信大部分的工程师都有类似的感受。这些问题发生在不同的技术领域,不同的技术方向,不同的模块,甚至不同的环境下,不一而足,就…

韩顺平老师的Linux基础学习笔记 (下)

Linux学习笔记 前言:本系列笔记的参考由 2021韩顺平 一周学会Linux 总结而成,希望能给学习Linux的同学一些帮助。也感谢韩老师录制的视频给我带来了非常巨大的收获! 目录: 韩顺平老师的Linux基础学习笔记 (上)韩顺平老师的Linu…

swagger2 介绍+注解说明

简介: 为什么要用swagger,我的理由是方便,作为后端开放人员,最烦的事就是自己写接口文档和前端交互是不是需要各种参数很繁琐,项目集成swagger后就能自动生成接口文档,做到前端、后端联调接口文档的及时性和便利性。 …