建造者模式 Builder Pattern
建造者模式应用十分广泛,也很简单。
建造者书写方式
@Getter
@Setter
public class HttpClient {
// 协议
private String protocol;
// 请求地址
private String url;
// 请求方法
private String method;
// 请求体
private String body;
// 请求头
private Map<String, String> headers;
// 请求参数
private Map<String, String> params;
// 建造者
public static class HttpClientBuilder {
private HttpClient client = new HttpClient();
public HttpClientBuilder protocol(String protocol) {
client.setProtocol(protocol);
return this;
}
public HttpClientBuilder url(String url) {
client.setUrl(url);
return this;
}
public HttpClientBuilder method(String method) {
client.setMethod(method);
return this;
}
public HttpClientBuilder body(String body) {
client.setBody(body);
return this;
}
public HttpClientBuilder headers(Map<String, String> headers) {
client.setHeaders(headers);
return this;
}
public HttpClientBuilder addHeader(String header, String headerValue) {
if (client.getHeaders() == null) {
client.setHeaders(new HashMap<>());
}
client.getHeaders().put(header, headerValue);
return this;
}
public HttpClientBuilder params(Map<String, String> params) {
client.setParams(params);
return this;
}
public HttpClient build() {
if (StrUtil.isEmpty(client.getUrl())) {
throw new RuntimeException("params url cannot be empty");
}
if (StrUtil.isEmpty(client.getMethod())) {
client.setMethod("get");
}
return client;
}
}
@Override
public String toString() {
return "HttpClient{" +
"url='" + url + '\'' +
", method='" + method + '\'' +
", body='" + body + '\'' +
", headers=" + headers +
", params=" + params +
'}';
}
}
使用建造者
public static void main(String[] args) {
HttpClient client = new HttpClient.HttpClientBuilder()
.protocol("http")
.url("http://www.baidu.com")
.body("abc")
.method("get")
// MapBuilder 也是构建者模式
.params(MapBuilder.<String, String>create()
.put("version", "v1")
.build()
)
.addHeader("content-type", "application/json")
.build();
System.out.println(client);
}
建造者模式书写方式
- 建造者类通识都已
Builder
结尾,建造者类提供builder()
方法返回需要构建的对象。 - 建造者类返回
this
,以达到链式调用的目的。 - 常用静态内部类方式(非必须)
何时使用建造者模式
- 当参数比较多、比较复杂时
- 当需要对属性进行检查、初始赋值时,在build方法中进行实现
使用 lombok 快速生成建造者代码
@Getter
@Setter
@Builder // 生成Builder类
@ToString
public class HttpClient2 {
// 协议
private String protocol;
// 请求地址
private String url;
// 请求方法
private String method;
// 请求体
private String body;
// 请求头
private Map<String, String> headers;
// 请求参数
private Map<String, String> params;
}
/// ### 用户代码
HttpClient2.HttpClient2Builder builder = new HttpClient2.HttpClient2Builder();
HttpClient2 client2 = builder.protocol("http")
.url("http://www.baidu.com")
.body("abc")
.method("get")
.params(MapBuilder.<String, String>create()
.put("version", "v1")
.build()
)
.build();