介绍
Builder模式可用于创建一个复杂对象。用户往往不知道内部情况,可以通过构建方法来精细控制构建过程。顾名思义,Build作为创建一个类的中介类,使用Builder的方法来设置要创建类中的各个需要的参数并进行构建对应的对象。Android中的AlterDialog就用到了此模式,另外像ImageLoader等也都用到了此模式。
UML
这是通常实际的构建者使用方式,不是经典使用UML。
使用场景
需要创建一个比较复杂的类,参数多,且很多参数都有可以默认值的时候。
事例
比如我们需要写一个控制推送注册的配置,那么可以按照如下方式来写配置类:
public class PushConfig {
/**
* 是否是debug模式
*/
public final boolean debugModel;
/**
* 是否订阅上下线
*/
public final boolean initPresence;
/**
* 是否注册推送
*/
public final boolean initPush;
/**
* 记录信息
*/
public final Builder.Info info;
private PushConfig(Builder builder) {
this.debugModel = builder.debugModel;
this.initPresence = builder.initPresence;
this.initPush = builder.initPush;
this.info = builder.info;
}
public static class Builder {
private boolean debugModel = false;
private boolean initPresence = true;
private boolean initPush = true;
private Info info;
public static class Info {
private String id;
private String name;
public Info(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 设置信息
*
* @param info
* @return
*/
public PushConfig.Builder setInfo(Info info) {
this.info = info;
return this;
}
/**
* 设置是否打印log
*
* @param debugModel
* @return true 打印
*/
public PushConfig.Builder setDebugModle(boolean debugModel) {
this.debugModel = debugModel;
return this;
}
/**
* 设置是否订阅上下线
*
* @param initPresence
* @return true 订阅
*/
public PushConfig.Builder setInitPresence(boolean initPresence) {
this.initPresence = initPresence;
return this;
}
/**
* 是否注册推送
*
* @param initJPush
* @return
*/
public PushConfig.Builder setInitPush(boolean initJPush) {
this.initPush = initJPush;
return this;
}
/**
* 关键方法,在配置完成后进行build就创建好配置了
* @return
*/
public PushConfig build() {
setEmptyValue();
return new PushConfig(this);
}
private void setEmptyValue() {
if (this.info == null) {
info = new Info("", "");
}
}
}
}
在使用的时候就可以根据自己想要的配置来选择设置:
//比如,配置打印日志,不订阅上下线
PushConfig pushBuildConfig = new PushConfig.Builder()
.setDebugModle(true)
.setInitPresence(false)
.build();
//接下来再真正使用的地方可以通过这个配置来进行选取执行哪种方式
总结:构建模式可以很方便的,在我们使用某个可动态配置功能的时候,进行行为配置参数配置等,不要忘记它的使用场景哦。可动态配置,那么就应该有一个默认配置哦,在有这种情况下,你就可以想想是不是可以采用构建者模式了