作者 | 李增光
杏仁后端工程师。只有变秃,才能变强!
记得之前,我在《effective java》上看过 Builder 构建器相关的内容,但实际开发中不经常用。后来,在项目中使用了 lombok ,发现它有一个注解 @Builder
,就是为 java bean 生成一个构建器。于是,回头重新复习了下相关知识,整理如下。
0.何为 Builder 模式 ?
Builder 模式 又被称作 建造者模式 或者 生成器模式.是一种设计模式。
维基百科上的定义为:
将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
一个典型的 Builder 模式的 UML 类图如下:
角色介绍:
Product 产品类 : 产品的抽象类。
Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程。
ConcreteBuilder : 具体的构建器。
Director : 统一组装过程(可省略)。
注意与抽象工厂模式的区别: 抽象工厂模式与生成器相似,因为它也可以创建复杂对象.主要的区别是生成器模式着重于一步步构造一个复杂对象.而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的).生成器在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的。
1. 为什么使用构建器模式 ?
若一个类具有大量的成员变量,我们就需要提供一个全参的构造器或大量的 set 方法.这让实例的创建和赋值,变得很麻烦,且不直观.我们通过构建器,可以让变量的赋值变成链式调用,而且调用的方法名对应着成员变量的名称.让对象的创建和赋值都变得很简洁、直观。
Builder 模式的使用场景:
相同的方法,不同的执行顺序,产生不同的事件结果时。
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。
2. lombok Builder使用样例
借助于 Lombok 我们可以快速创建 Builder 模式。首先,创建一个名为 User 的 Java Bean,非常简单,只有两个属性,sex,和 name。其中 @Builder
可以自动为 User 对象生成一个构建器,@ToString
可以自动为 User 对象生成 toStrng()
方法。
@Builder
@ToString
public class User {
private Integer sex;
private String name;
}
现来测试一下 Lombok 为我们自动提供的构建器功能:
@Test
public void builderTest() {
User user = User.builder()
.name("杏仁")
.sex(1)
.build();
System.out.println(user.toString());
}
会看到控制台打印:
User(sex=1,name=杏仁)
可以看到,打印结果就是我们想要的样子,但是 Lombok 为我们做了什么事情呢?
使用 Lombok 需要注意理解 Lombok 的注解做了什么,否则很容易出错。
3. 反编译 Lombok 生成的 User.class
*注意:下面请区分两组名词:"builder方法"和“build方法”,“构造器”和“构建器”。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)