Builder构建者模式主要表现在:如果类的属性之间有一定的依赖关系或者约束条件,那么可以使用构建者设计模式对类对象进行创建
将创建对象时使用的繁杂的setter方法去除,通过链式进行选择性的属性赋值并创建获取对象
应用场景
如果需要创建某个类A的实例对象,而对象中包含许多的属性,构造器函数过多以及属性之间存在依赖关系和约束条件
- 首先需要获取该实体类对应的ABuilder对象
- ABuilder对象中包括类A的属性信息以及对应属性值的设置方法
- ABuilder中还包含一个build方法,该方法主要负责将属性填充到类A中
- 未传值的属性使用默认值
@Getter
@Setter
public class A {
private String url;
private Object parameter;
private String httpType;
public static ABuilder newABuilder() { return new ABuilder(); }
private A(String url, Object parameter, String httpType) {
this.url = url;
this.parameter = parameter;
this.httpType = httpType;
}
}
@Getter
@Setter
public static class ABuilder{ //Builder类同时也可以作为类的内部类定义
private String url;
private Object parameter;
private String httpType;
public Builder parameter(Object parameter) { this.parameter = parameter; return this;}
public Builder url(String url) { this.url = url; return this; }
public Builder httpType(String httpType) { this.httpType = httpType; return this; }
public A build() {
if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允许为空 "); }
// ...
return new A(url, parameter, httpType);
}
}
当我们想要创建一个A类实例对象时,即可通过ABuilder类进行链式的创建
A a = A.newABuilder()
.url("192.168.*.*")
.parameter(parameter)
.httpType("1")
.build();
@Builder
同时我们也可以引用lombok的@Builder注解直接完成builder设计模式的使用,该注解在A类中创建了一个ABuilder的静态内部类,而无需手动在类中再创建newABuilder()方法
首先引入Lombok的依赖坐标:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Getter
@Setter
@Builder
public class A {
private String url;
private Object parameter;
private String httpType;
//public static ABuilder builder() { return new ABuilder(); }
private A(String url, Object parameter, String httpType) {
this.url = url;
this.parameter = parameter;
this.httpType = httpType;
}
//@Builder注解相当于在类A中创建了这样一个静态内部类
/*public static class ABuilder{
private String url;
private Object parameter;
private String httpType;
public Builder parameter(Object parameter) { this.parameter = parameter; return this;}
public Builder url(String url) { this.url = url; return this; }
public Builder httpType(String httpType) { this.httpType = httpType; return this; }
public A build() {
if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允许为空 "); }
// ...
return new A(url, parameter, httpType);
}
}*/
}
//创建类A的实例对象
A a = A.builder()
.url("192.168.*.*")
.parameter(parameter)
.httpType("1")
.build();
@Builder.Default可设置非final属性的默认值
@Builder.Default
private String url = "192.168.*.*";
@Builder(toBuilder = true)表示可对该对象进行拷贝生成新的对象,可用于对已生成的对象属性进行修改,默认为false
@Builder(toBuilder = true)
public class A {
//...
}
//创建类A的实例对象
A a = A.builder()
.url("192.168.*.*")
.parameter(parameter)
.httpType("1")
.build();
//修改类A的属性信息
a.toBuilder().
.url("192.168.*.*")
.parameter(parameter)
.httpType("1")
.build();
总结:通过Builder构建者设计模式可实现创建对象填充属性时的链式操作,从而减少大量的set操作,提高代码的可读性。