首页 > 应用开发 > IT综合 > 详解建造者模式(含图例、UML类图、源码示例等)
来源:mikechen的互联网架构
为什么要学设计模式?设计模式有哪些优点?
提升查看框架源码能力 提升对复杂业务代码的设计能力以及 code 能力 为今后面试以及技术进阶夯实基础
今天我们要讲的是设计模式中的建造者模式(Builder)。
建造者模式(Builder)是创建型模式中的一种,在面向对象编程中常用,必知必会。

建造者模式(builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
例如:
我们要定制一台电脑,我们只需要确认配件品牌及型号,而不必知道组装电脑的这个过程。

这种情况下,我们可以采用建造者模式,将配件和组装电脑的过程分离,让构建过程和配件都能自由拓展,降低两者之间的耦合。
为了加深理解,我们来看下建造者模式的 UML 类图。

建造者模式的 4 个重要角色:
@Overridepublic StringBuilder append(CharSequence s) { super.append(s);// 实现过程略 return this;}将此字符序列用其反转形式取代:
@Overridepublic StringBuilder reverse() { super.reverse();// 实现过程略 return this;}测试代码:
StringBuilder sb = new StringBuilder("12345");sb.append("67890");sb.reverse();System.out.println(sb);StringBuilder sb1 = new StringBuilder("12345");sb1.reverse();sb1.append("67890");System.out.println(sb1);结果:
System.out: 0987654321System.out: 1422167890
根据 StringBuilder 不同方法的不同调用顺序,可以生成不同的字符串,这样的操作很灵活。
2)建造者模式在很多第三方框架中也有实现。
例如,网络框架 OkHttp3中的 OkHttpClient、Request。
我们来看下 OkHttpClient 、及其内部类 OkHttpClient、Builder 的部分源码:
默认采用 Builder 进行建造:
public OkHttpClient() { this(new Builder());}由 builder 配置分发器、代理、协议以及自定义拦截器等:
OkHttpClient(Builder builder) {this.dispatcher = builder.dispatcher;this.proxy = builder.proxy;this.protocols = builder.protocols;/** 省略大段代码 */boolean isTLS = false;for (ConnectionSpec spec : connectionSpecs) {isTLS = isTLS || spec.isTls();}/** 省略大段代码. */if (interceptors.contains(null)) {throw new IllegalStateException("Null interceptor: " + interceptors);}if (networkInterceptors.contains(null)) {throw new IllegalStateException("Null network interceptor: " + networkInterceptors);}}public static final class Builder {public Builder() {
分发器、协议、代理的默认参数:
dispatcher = new Dispatcher();protocols = DEFAULT_PROTOCOLS;proxySelector = ProxySelector.getDefault();if (proxySelector == null) {proxySelector = new NullProxySelector();}}Builder(OkHttpClient okHttpClient) {
反向配置分发器、代理、协议:
this.dispatcher = okHttpClient.dispatcher; this.proxy = okHttpClient.proxy; this.protocols = okHttpClient.protocols;
新增所有自定义拦截器和自定义网络拦截器:
this.interceptors.addAll(okHttpClient.interceptors); this.networkInterceptors.addAll(okHttpClient.networkInterceptors); }
配置代理:
public Builder proxy(@Nullable Proxy proxy) { this.proxy = proxy; return this; }向拦截器链中增加自定义拦截器:
public Builder addInterceptor(Interceptor interceptor) { if (interceptor == null) throw new IllegalArgumentException("interceptor == null"); interceptors.add(interceptor); return this; }build() 方法,生成 OkHttpClient 对象:
public OkHttpClient build() { return new OkHttpClient(this); }}使用建造者模式可以使客户端不必知道产品内部组成的细节;
具体的建造者类之间是相互独立的,容易扩展;
由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024924/viewspace-2996448/ ,如需转载,请注明出处,否则将追究法律责任。