(设计模式)区分建造者、 规格模式(MyBatis Example+Criteria )

在日常开发中,我们经常会接触到两类常见的设计模式:建造者模式(Builder Pattern) 和 规格模式(Specification Pattern) 。

它们在写法上看起来有些相似,比如都喜欢用链式调用,但它们关注的点完全不同。本文将结合实际代码和 MyBatis 的 Example + Criteria,带你彻底理解这两种模式。


一、建造者模式(Builder Pattern)

1. 定义

建造者模式的核心思想是:一步步构建一个复杂对象,最后一次性生成 。

它解决了对象构造函数过于复杂的问题,使得对象创建更清晰、可控。

2. 特点

  • 链式调用,可读性强。

  • 避免构造函数参数爆炸。

  • 保证对象完整性,减少遗漏。

3. 示例代码

比如我们要构建一个用户对象:

User user = User.builder() .id(1L) .name("张三") .age(20) .gender("M") .build();

如果不用 Builder,你可能要写:

User user = new User();

user.setId(1L);

user.setName("张三");

user.setAge(20);

user.setGender("M");

相比之下,建造者模式更优雅、可维护。


二、规格模式(Specification Pattern)

1. 定义

规格模式的核心思想是:把业务规则/条件抽象成独立的对象,可以复用和组合 。

常见于查询条件构造和业务规则校验。

2. 特点

  • 条件可以独立定义,再动态组合。

  • 避免写死在 if 语句里,可读性更好。

  • 符合面向对象的思想,能扩展、复用。


三、MyBatis Generator 的 Example + Criteria

在 MyBatis 中,Example + Criteria 就是 规格模式的典型实现,它把 SQL 的 WHERE 条件对象化了。

1. Example

Example 是条件的 大容器 ,内部可以包含多个 Criteria。

2. Criteria

Criteria 是条件组,内部条件之间默认用 AND 连接;多个 Criteria 之间用 OR 连接。


3. 使用示例

假设我们有一张用户表 user,字段包括 id、username、status。

UserExample example = new UserExample(); // 第一个条件组:AND UserExample.Criteria criteria1 = example.createCriteria(); criteria1.andUsernameEqualTo("Alice"); criteria1.andStatusEqualTo("ACTIVE"); // 第二个条件组:AND UserExample.Criteria criteria2 = example.createCriteria(); criteria2.andUsernameEqualTo("Bob"); criteria2.andStatusEqualTo("ACTIVE"); // 用 OR 拼接 example.or(criteria2); List<User> list = userMapper.selectByExample(example);

对应的 SQL:

SELECT * FROM user WHERE (username = 'Alice' AND status = 'ACTIVE') OR (username = 'Bob' AND status = 'ACTIVE');

相关推荐
10mAh7 小时前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
thefool1122667 小时前
多线程 4
java
Rain的Java大神之路7 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源7 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室8 小时前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku8 小时前
JDK 13 新特性详解
java·开发语言
秋饼8 小时前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
今年下半年8 小时前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
WeiXin_DZbishe8 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
Wang's Blog8 小时前
Java 项目部署之 Docker工具快速入门: 使用 Docker 镜像命令练习
java·docker