建造者模式的优点及其在优秀框架中的实现案例

建造者模式概述

定义

建造者模式通过创建一个产品的构建者对象,逐步构建最终的产品对象。与传统的构造方法不同,建造者模式允许通过对产品的各个部分进行逐步配置,最终生成一个完整的产品。

结构

建造者模式通常由以下几个角色组成:

  1. 产品(Product):表示所需构建的复杂对象。
  2. 建造者(Builder):定义创建产品所需的接口。
  3. 具体建造者(ConcreteBuilder):实现建造者接口,提供创建具体产品的实现。
  4. 指挥者(Director):负责协调构建过程,使用建造者接口构建产品。

建造者模式的优点

  1. 解耦合:建造者模式将对象的构建与表示分离,客户端不需要直接与具体构建逻辑打交道,从而降低了系统的耦合性。

  2. 灵活性和可扩展性:添加新产品或修改已有产品时,只需扩展或修改相关的建造者,不需改变客户端代码,大大提高了系统的灵活性。

  3. 代码可读性:链式调用和直观的构建过程使得代码可读性大大增强,尤其是在创建复杂对象时能够清晰表达意图。

  4. 构建过程的一致性:通过指挥者来协调构建过程,可以保证每次构建时产品的一致性和正确性。

优秀框架中的建造者模式应用案例

1. Lombok

Lombok 是一个流行的 Java 库,提供了众多实用功能,其中之一就是通过 @Builder 注解支持建造者模式。这个库显著简化了对象的创建。

import lombok.Builder;@Builder
public class User {private String name;private int age;
}// 使用方式
User user = User.builder().name("Alice").age(25).build();

优点解析:Lombok 的 @Builder 注解使得构造模式不仅更简洁,也让代码更易于维护。开发者无需手动编写建造者类,且通过链式调用,提升了可读性。

2. Apache HttpClient

Apache HttpClient 框架广泛用于进行 HTTP 请求,它的 HttpGetHttpPost 等类采用了建造者模式。

HttpGet httpGet = new HttpGetBuilder("http://example.com").setHeader("Authorization", "Bearer TOKEN").setParameter("key", "value").build();

优点解析:HttpClient 的建造者模式让请求的构建过程简单清晰。参数以可读的链式方式设置,使得代码能够更好地表达意图,减少出错的机会。

3. Google Guava

Guava 提供丰富的工具类来处理集合等功能,它的 ImmutableListImmutableMap 类同样使用了建造者模式。

ImmutableList<String> list = ImmutableList.<String>builder().add("Item 1").add("Item 2").add("Item 3").build();

优点解析:Guava 的建造者模式实现允许用户以更直观的方式构建不可变集合,降低了使用复杂性,为开发者提供了更好的编码体验。

4. Spring Framework

Spring 框架利用建造者模式处理各种对象的创建,例如 RestTemplate 的构建。

RestTemplate restTemplate = new RestTemplateBuilder().setConnectTimeout(5000).setReadTimeout(2000).build();

优点解析:Spring 的设计者通过建造者模式使得各种 Bean 的配置更加灵活,提供了一种易于使用的 API,从而快速构建和配置复杂对象。

5. JUnit

JUnit 5 中的断言 API 和测试配置也采用了建造者模式的设计。

assertThat(myObject).isNotNull().isEqualTo(expectedValue);

优点解析:JUnit 利用建造者模式使得测试的断言语句更具可读性,链式调用的方式使得用户可以直观地理解每个断言的意图。

总结

建造者模式作为一种有效的设计模式,在多个优秀框架中得到了有效应用,其优点展现在以下几个方面:

  • 降低耦合度:将对象的构建过程与表示分离。
  • 提升灵活性与可扩展性:易于维护和扩展。
  • 增强代码可读性:通过链式调用,清晰地表达对象的构建过程。

在现代软件开发中,很多优秀框架为了提升代码质量和开发体验,广泛采用建造者模式,这不仅提高了代码的可维护性,也帮助开发者更快速高效地达到设计目标。借助建造者模式,开发者可以专注于业务逻辑,减少复杂对象创建的负担,从而写出更优雅、可扩展和可测试的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日事清甘特图制作工具:一键生成,精准管理项目周期

在工作中&#xff0c;我们很多岗位都经常需要对项目进度进行追踪&#xff0c; 例如人事经理需要要追踪招聘进度或员工培训计划&#xff0c;项目经理负责监督项目的各个阶段以保证按计划执行&#xff0c;软件研发经理则需确保功能迭代的及时交付&#xff0c;而市场经理负责监控…

vue 加载动态效果,自行封装组件

背景&#xff1a; 在项目开发中&#xff0c;会请求接口&#xff0c;就会遇到加载中、加载成功、加载失败、和加载成功但暂无数据等情况。就自行封装了一个加载组件。采用vue3elementsetup组合式写法。 实现效果&#xff1a; 封装组件&#xff1a; //封装组件 <template>…

SQLark SQL编辑器秘籍,编写高效SQL查询

SQLark 是一款功能强大的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;支持达梦、Oracle 和 MySQL 数据库。SQLark内置的 SQL 编辑器&#xff0c;基于语法解析&#xff0c;集成智能提示、实时语法检查及语法高亮等功能&#xff0…

Flutter项目之table页面实现

目录&#xff1a; 1、首页页面index.dart&#xff08;首页table页面&#xff09; 1、首页页面 效果图&#xff1a; index.dart&#xff08;首页table页面&#xff09; import package:flutter/material.dart; import package:flutter_haoke/pages/home/info/index.dart; impo…

【学习笔记】卷积网络简介及原理探析

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接&#xf…

【北京迅为】iTOP-RK3568开发板鸿蒙OpenHarmony系统南向驱动开发实操-HDF驱动配置UART

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【蓝桥杯每日一题】3.25

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x “OJ超时不是终点&#xff0c;是算法在提醒你该优化时间复杂度了&#xff01;” 目录 3.25 差分数组 一、一维差分 题目链接&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a;…

穿透Session 0隔离

1、前言 在 Windows XP 和 Windows Server 2003 之前&#xff0c;用户和服务会共享同一个会话&#xff0c;而这个会话是由第一个登录到控制台的用户来启动的&#xff0c;该会话就称为Session 0。 而从Windows Vista 开始&#xff0c;Windows 采取了会话隔离的措施&#xff0c;…

大模型思维链COT:Chain-of-Thought Prompting Elicits Reasoningin Large Language Models

一、TL&#xff1b;DR 探索了COT&#xff08;chain-of-thought prompting&#xff09;通过一系列的中间推理步骤来显著的提升了LLM的复杂推理能力在三个大型语言模型上的实验表明&#xff0c;思维链提示能够提升模型在一系列算术、常识和符号推理任务上的表现解释了一下为什么…

颠覆传统:SaaS 品牌如何通过 SEO 策略引爆市场!

SaaS 商业模式提供了令人难以置信的可扩展性和盈利能力——但前提是与正确的营销增长策略相结合。 SaaS 品牌知道&#xff0c;托管基于云的应用程序的成本会随着用户量的增加而降低&#xff0c;因此必须专注于订阅者的快速增长&#xff0c;以保持竞争力并降低成本。 许多 CMO…

大模型训练 | 智能体知识库 资源收集之心理咨询问答数据集

最近我一直在研究AI大模型相关的内容&#xff0c;想着从现在开始慢慢收集各种各样的资源&#xff0c;万一以后需要训练大模型的时候可以用到&#xff0c;或者自己以后也许会需要。今天我想介绍一组“心理咨询问答数据集”产品&#xff0c;包含9414条心理咨询问答数据&#xff0…

vivado 创建生成时钟

创建生成时钟 生成时钟源自另一个现有时钟 &#xff08;主时钟&#xff09;。通常用来描述由逻辑块在主时钟上执行的波形变换。由于生成时钟的定义 取决于主时钟特性&#xff0c;因此必须首先定义主时钟。要明确定义生成时钟&#xff0c;必须使用 create_generated_clock 命…

数据清洗:基于python抽取jsonl文件数据字段

基于python抽取目录下所有“jsonl”格式文件。遍历文件内某个字段进行抽取并合并。 import os import json import time from tqdm import tqdm # 需要先安装&#xff1a;pip install tqdmdef process_files():# 设置目录路径dir_path r"D:\daku\关键词识别\1623-00000…

《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型理解重叠 I/O 模型重叠 I/O本章讨论的重叠 I/O 的重点不在于 I/O 创建重叠 I/O 套接字执行重叠 I/O 的 WSASend 函数进行重叠 I/O 的 WSA…

html css 网页制作成品——HTML+CSS非遗文化扎染网页设计(5页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…

飞书只有阅读权限的文档下载,飞书文件下载

wx搜索公zhong号&#xff1a;"狮心王"回复"飞书文档保存"下载chrome扩展文件 拿到扩展文件之后给chrome添加扩展

避免踩坑!查收查引常见问题解答

Q1&#xff1a;为什么我的论文刚发表&#xff0c;在查引系统中却查不到&#xff1f; 这是由于数据库存在数据延迟。SCI、SSCI等索引平台通常需要1-3个月更新数据&#xff0c;而中文数据库如CNKI也可能延迟1-2周。建议在论文发表后耐心等待&#xff0c;或直接联系数据库客服…

Centos7 Gitlab17部署

确保你的安装源正常 1.安装依赖项 sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix 2.安装Gitlab (1)添加仓库 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash (2) 安装Gitl…

[数据结构]1.时间复杂度和空间复杂度

这里写目录标题 1. 算法复杂度2. 时间复杂度2.1 执行次数2.2 大O渐进表示法2.3 常见时间复杂度计算eg1eg2eg3eg4eg5eg6eg7eg8eg9 3. 空间复杂度eg1eg2eg3eg4 4. 常见复杂度对比5. 复杂度练习eg1 1. 算法复杂度 衡量一个算法的好坏&#xff0c;一般是从时间空间两个维度来衡量&…