架构师成长之路-设计模式-08.建造者模式 Builder Pattern

建造者模式 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);
    }

建造者模式书写方式

  1. 建造者类通识都已 Builder 结尾,建造者类提供 builder() 方法返回需要构建的对象。
  2. 建造者类返回 this,以达到链式调用的目的。
  3. 常用静态内部类方式(非必须)

何时使用建造者模式

  1. 当参数比较多、比较复杂时
  2. 当需要对属性进行检查、初始赋值时,在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();

完整源码地址

本文完整代码

你可能感兴趣的:(架构师成长之路-设计模式,建造者模式,java,设计模式)