(设计模式)区分建造者、 规格模式(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');