将一个复杂对象的构建与其表现(功能)分离,使得同样的构建过程可以创建不同的表现(功能)。
秒懂设计模式之建造者模式(Builder pattern)
把对象初始化的过程放在一个Builder类中,通过Builder.build()方法,生成目标对象。
要创建的对象,初始化过程比较复杂,参数较多,参数又是可选可配置的。
实际应用中,可能不按照这个标准来,比如Okhttp和EventBus。
建造者模式的目的是通过Builder类创建可配置的对象。
工厂模式更加宏观一些,工厂模式主要目的的是通过不同的工厂,得到不同种类的产品。
具体某个工厂是如何生产产品的,如果比较复杂,可以采用建造者模式。所以建造者模式和工厂模式,并不冲突。
java.lang.Appendable
public interface Appendable {
Appendable append(CharSequence csq) throws IOException;
Appendable append(CharSequence csq, int start, int end) throws IOException;
Appendable append(char c) throws IOException;
}
java.lang.AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
@Override
public AbstractStringBuilder append(CharSequence s) {
...
}
@Override
public AbstractStringBuilder append(CharSequence s, int start, int end) {
...
}
@Override
public AbstractStringBuilder append(char c) {
...
}
@Override
public abstract String toString();
}
java.lang.StringBuilder
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
...
}
这里重点是建造者模式,对于StringBuilder不做深入分析。
以上代码只是分析,在实际应用中用String,还是用StringBuilder,StringBuffer,还是要具体情况具体分析。
从JDK中学习设计模式——建造者模式
在这篇:Okhttp系列:简单的不用传参的Get请求示例 中写了一个简单的网络请求,可以看到,Okhttp的request是通过Builder生成的。
String url = "https://publicobject.com/helloworld.txt";
OkHttpClient client = new OkHttpClient();
//通过Builder创建请求体
Request request = new Request.Builder().url(url).get().build();
//执行请求
Response response = null;
try {
response = client.newCall(request).execute();
//获取服务器响应数据
if (response.isSuccessful()) {
String result = response.body().string();
Log.e("xxx", result);
}
} catch (IOException e) {
e.printStackTrace();
}
EventBus不仅可以创建单例对象,还可以创建可配置对象,这种情况应用的少。从EventBus官方文档中,复制一段代码:
EventBus eventBus = EventBus.builder()
.logNoSubscriberMessages(false)
.sendNoSubscriberEvent(false)
.build();
那如果我们既想配置上面的选项,又想获得单例模式,怎么办了?
使用installDefaultEventBus()
:
EventBus eventBus = EventBus.builder()
.logNoSubscriberMessages(false)
.sendNoSubscriberEvent(false)
.installDefaultEventBus();
installDefaultEventBus
()方法是EventBusBuilder.java里面的,具体源码分析参考:EventBus设计模式剖析(二)建造者模式