优雅使用Builder模式(构建者模式)
简单介绍
Builder 模式是一种创建型设计模式,用于构建复杂对象,强调的是 管理依赖关系或者约束条件。它允许构建一个包含许多可选参数的对象,同时保持构造函数的简洁性。
在 Builder 模式中,通常会定义一个 Builder 类,用于设置对象的各个参数,最后通过调用 build 方法来构建对象。这样可以避免构造函数参数过多导致的混乱,同时还可以保证对象在构建过程中处于一种一致的状态。
优雅使用
干巴巴的文字总是抽象的,我这边就直接上代码好了。
假设我们有一个 HttpParameters
类用于封装 HTTP 请求的参数。这个类包含一个静态内部类 Builder
,用于构建 HttpParameters
对象。下面我们将展示如何使用 Builder 模式来构建 HttpParameters
对象:
首先是 HttpParameters
类:
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
@Getter
@AllArgsConstructor
public class HttpParameters {
private Builder builder;
public static Builder newBuilder() {
return new Builder();
}
@Getter
public static class 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 HttpParameters build() {
// 执行校验
validate();
// ... 其他的构建逻辑
return new HttpParameters(this);
}
private void validate() {
if (StringUtils.isBlank(url)) {
throw new IllegalStateException("URL cannot be blank");
}
if (parameter == null) {
throw new IllegalStateException("Parameter cannot be null");
}
if (StringUtils.isBlank(httpType)) {
throw new IllegalStateException("HTTP type cannot be blank");
}
// 可以添加更多的校验逻辑
}
}
}
下面是使用 Builder 模式构建的 HttpParameters
:
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
// 使用静态方法 newBuilder() 创建 Builder 对象
HttpParameters.Builder builder = HttpParameters.newBuilder();
// 使用 Builder 对象设置参数
builder.url("https://example.com/api/endpoint")
.httpType("GET")
.parameter("someParameter");
// 构建 HttpParameters 对象
HttpParameters httpParameters = builder.build();
// 使用 @Getter 注解确保可以访问 Builder 类中定义的字段
System.out.println("URL: " + httpParameters.getBuilder().getUrl());
System.out.println("HTTP Type: " + httpParameters.getBuilder().getHttpType());
System.out.println("Parameter: " + httpParameters.getBuilder().getParameter());
}
}
或者:
public class Main {
public static void main(String[] args) {
HttpParameters httpParameters = HttpParameters.newBuilder()
.url("https://example.com/api/endpoint")
.httpType("GET")
.parameter("someParameter")
.build();
System.out.println("URL: " + httpParameters.getBuilder().getUrl());
System.out.println("HTTP Type: " + httpParameters.getBuilder().getHttpType());
System.out.println("Parameter: " + httpParameters.getBuilder().getParameter());
}
}
在上面的代码中,我们使用 Builder 模式构建了一个 HttpParameters
对象,然后通过链式调用优雅地设置了 url、httpType和parameter这些变量,最后最后调用 build 方法来构建对象同时进行相应的参数校验。可以看出Builder 模式使得构建复杂对象的过程更加灵活和可控。
应用场景
Builder 模式应用场景:如果类的属性之间有一定的依赖关系或者约束条件,那么就可以考虑使用 Builder 设计模式。
Builder 模式通常在以下情况下特别有用:
- 构建复杂对象: 当您需要创建具有许多可选参数的复杂对象时,Builder 模式可以提供一种优雅的方式来构建对象,避免使用过多的构造函数参数。
- 避免重叠构造函数: 当类具有多个构造函数,且参数列表重叠或非常相似时,Builder 模式可以提供一种更清晰的构建过程,使代码更易于阅读和维护。
- 参数校验: 使用 Builder 模式可以在构建对象的过程中执行参数校验,确保所有必要的参数都已设置,并在必要时抛出异常,使得代码更加健壮和可靠。
- 创建不可变对象: 当您希望创建不可变对象时,可以在 Builder 模式中设置对象的属性,并在构建后使得对象不可变,提高对象的安全性和线程安全性。