将一个复杂对象的构建与它的表示解耦,使得用户在不需要知道其内部构建细节的情况下,依然可以精细的构建出不同表示的复杂对象。
优点:1. 良好的封装性;
2. 建造者的独立性,使得易于扩展;
缺点:会产生多余的Builder对象,消耗内存。
使用场景
- 初始化一个对象特别复杂(如参数很多,且很多参数都有默认值),且构建之后变化性不大的。
- 相同方法,不同执行顺序,产生不同结果。
如:网络请求、ImageLoader的config配置
Builder模式也是一种比较常用的模式,比如经常用到的AlertDialog:
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("title")
.setMessage("message")
.create();
当然,AlertDialog也爆漏了一些属性设置的方法,但是不能链式调用:
dialog.setTitle("title_1"); dialog.setMessage("message_1");
常用实现
public class Config {
private Builder builder;
private Config(Builder builder) {
//属性赋值
this.builder = builder;
}
public long getConnectTimeout() {
return builder.connectTimeout;
}
/**
* 静态内部类 Builder
*/
public static class Builder {
private long connectTimeout = 30 * 1000;
private long responseTimeout = 30 * 1000;
private long timeout = 60 * 1000;
private boolean isUseCache = true;
private boolean isUseDiskCache = false;
public Config build() {
return new Config(this);
}
public Builder setConnectTimeout(long connectTimeout) {
this.connectTimeout = connectTimeout;
return this;
}
public Builder setResponseTimeout(long responseTimeout) {
this.responseTimeout = responseTimeout;
return this;
}
public Builder setTimeout(long timeout) {
this.timeout = timeout;
return this;
}
public Builder setUseCache(boolean useCache) {
isUseCache = useCache;
return this;
}
public Builder setUseDiskCache(boolean useDiskCache) {
isUseDiskCache = useDiskCache;
return this;
}
}
}
使用:
Config config = new Config.Builder() .setConnectTimeout(10 * 1000) .setUseDiskCache(true) .build();
网友评论