设计模式:不再手动 set DTO,采用 Builder 模式

文章目录

一、背景

在实际项目中,我们经常需要构造一些字段很多的 DTO、请求对象或结果对象。

一开始,最自然的写法,往往就是 new 一个对象,然后一行一行 set

但当对象逐渐变复杂,这种写法会很快暴露问题。

这篇文章通过一个非常典型的对比,讲清楚:
为什么在复杂对象构建场景下,Builder 模式会比手动 set 更合适。

二、手动set

你一定见过这样的代码:

java 复制代码
MatchResult result = new MatchResult();
result.setResumeId(resumeId);
result.setPositionId(positionId);
result.setFinalScore(finalScore);
result.setRagScore(ragScore);
result.setGraphScore(graphScore);
result.setLlmScore(llmScore);
result.setMatchedSkills(matchedSkills);
result.setMissingSkills(missingSkills);
result.setExtraSkills(extraSkills);
result.setRecommendLevel(recommendLevel);
result.setMatchGrade(matchGrade);

手动 set 写法的几个问题

  1. 代码冗余,可读性差
  2. 容易构造出"半成品对象"
  3. 必填字段只能靠约定
  4. 扩展成本高,容易漏改

三、使用builder模式

java 复制代码
/**
 * 匹配结果实体
 *
 * @author QinFeng Luo
 * @date 2026/01/12
 */

@Data
// 这里使用builder注解
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MatchResult {

    /**
     * 简历 ID
     */
    private String resumeId;

    /**
     * 岗位 ID
     */
    private String positionId;

    /**
     * 综合得分(0-100)
     */
    private float finalScore;

    /**
     * RAG 语义相似度得分(0-100)
     */
    private float ragScore;

    /**
     * 知识图谱技能匹配得分(0-100)
     */
    private float graphScore;

    /**
     * LLM 综合评估得分(0-100)
     */
    private float llmScore;

    /**
     * 匹配的技能列表
     */
    private List<String> matchedSkills;

    /**
     * 缺失的技能列表
     */
    private List<String> missingSkills;

    /**
     * 候选人额外技能
     */
    private List<String> extraSkills;

    /**
     * LLM 评估报告
     */
    private String llmReport;

    /**
     * 详细评分明细
     */
    private Map<String, Object> scoreDetails;

    /**
     * 推荐指数(1-5星)
     */
    private int recommendLevel;

    /**
     * 匹配等级(A/B/C/D)
     */
    private String matchGrade;
}
java 复制代码
MatchResult result = MatchResult.builder()
        .resumeId(resumeId)
        .positionId(positionId)
        .finalScore(finalScore)
        .ragScore(ragScore)
        .graphScore(graphScore)
        .llmScore(llmScore)
        .matchedSkills(matchedSkills)
        .missingSkills(missingSkills)
        .extraSkills(extraSkills)
        .recommendLevel(recommendLevel)
        .matchGrade(matchGrade)
        .build();

四、使用builder模式的好处

1、 可读性明显更好

java 复制代码
builder()
  .xxx()
  .yyy()
  .zzz()
  .build()

2、对象构建是原子操作

java 复制代码
MatchResult result = MatchResult.builder()
        ...
        .build();

要么构建成功,

要么直接失败。

不会再出现"半成品对象"。

3、对扩展更加友好

当新增字段时:

Builder 增加一个方法

旧代码不需要改

需要使用新字段的地方再补

不需要更改之前的原始代码

相关推荐
AI人工智能+电脑小能手11 小时前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu13 小时前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏14 小时前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术14 小时前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术14 小时前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
KhalilRuan14 小时前
设计模式小记
设计模式
卡牌RWA研究院15 小时前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
剧中有戏1 天前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客2 天前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o2 天前
设计模式 18 · 状态模式
设计模式·状态模式