今天在看Hystrix源码时看了builder模式,为什么会这样使用呢?当构造器中的参数很多时,并且参数的顺序会给人造成困扰的时候,那么使用建造者模式来创建不可变类就是非常好的方法了。直接上代码,废话不多说。
调用入口
public MetaHolder create(Object proxy, Method method, Object obj, Object[] args, final
ProceedingJoinPoint joinPoint) {
HystrixCommand hystrixCommand = method.getAnnotation(HystrixCommand.class);
ExecutionType executionType = ExecutionType.getExecutionType(method.getReturnType());
MetaHolder.Builder builder = metaHolderBuilder(proxy, method, obj, args, joinPoint);
if (isCompileWeaving()) {
builder.ajcMethod(getAjcMethodFromTarget(joinPoint));
}
return builder.defaultCommandKey(method.getName())
.hystrixCommand(hystrixCommand)
.observableExecutionMode(hystrixCommand.observableExecutionMode())
.executionType(executionType)
.observable(ExecutionType.OBSERVABLE == executionType)
.build();
MetaHolder.Builder metaHolderBuilder(Object proxy, Method method, Object obj, Object[] args, final ProceedingJoinPoint joinPoint) {
MetaHolder.Builder builder = MetaHolder.builder()
.args(args).method(method).obj(obj).proxyObj(proxy)
.joinPoint(joinPoint);
setFallbackMethod(builder, obj.getClass(), method);
builder = setDefaultProperties(builder, obj.getClass(), joinPoint);
return builder;
}
public final class MetaHolder {
private final HystrixCollapser hystrixCollapser;
private final HystrixCommand hystrixCommand;
private final DefaultProperties defaultProperties;
private final Method method;
private final Method cacheKeyMethod;
private final Method ajcMethod;
private final Method fallbackMethod;
private final Object obj;
private final Object proxyObj;
private final Object[] args;
private final Closure closure;
private final String defaultGroupKey;
private final String defaultCommandKey;
private final String defaultCollapserKey;
private final String defaultThreadPoolKey;
private final ExecutionType executionType;
private final boolean extendedFallback;
private final ExecutionType collapserExecutionType;
private final ExecutionType fallbackExecutionType;
private final boolean fallback;
private boolean extendedParentFallback;
private final JoinPoint joinPoint;
private final boolean observable;
private final ObservableExecutionMode observableExecutionMode;
private MetaHolder(Builder builder) {
this.hystrixCommand = builder.hystrixCommand;
this.method = builder.method;
this.cacheKeyMethod = builder.cacheKeyMethod;
this.fallbackMethod = builder.fallbackMethod;
this.ajcMethod = builder.ajcMethod;
this.obj = builder.obj;
this.proxyObj = builder.proxyObj;
this.args = builder.args;
this.closure = builder.closure;
this.defaultGroupKey = builder.defaultGroupKey;
this.defaultCommandKey = builder.defaultCommandKey;
this.defaultThreadPoolKey = builder.defaultThreadPoolKey;
this.defaultCollapserKey = builder.defaultCollapserKey;
this.defaultProperties = builder.defaultProperties;
this.hystrixCollapser = builder.hystrixCollapser;
this.executionType = builder.executionType;
this.collapserExecutionType = builder.collapserExecutionType;
this.fallbackExecutionType = builder.fallbackExecutionType;
this.joinPoint = builder.joinPoint;
this.extendedFallback = builder.extendedFallback;
this.fallback = builder.fallback;
this.extendedParentFallback = builder.extendedParentFallback;
this.observable = builder.observable;
this.observableExecutionMode = builder.observableExecutionMode;
}
public static Builder builder() {
return new Builder();
}
public static final class Builder {
private HystrixCollapser hystrixCollapser;
private HystrixCommand hystrixCommand;
private DefaultProperties defaultProperties;
private Method method;
private Method cacheKeyMethod;
private Method fallbackMethod;
private Method ajcMethod;
private Object obj;
private Object proxyObj;
private Closure closure;
private Object[] args;
private String defaultGroupKey;
private String defaultCommandKey;
private String defaultCollapserKey;
private String defaultThreadPoolKey;
private ExecutionType executionType;
private ExecutionType collapserExecutionType;
private ExecutionType fallbackExecutionType;
private boolean extendedFallback;
private boolean fallback;
private boolean extendedParentFallback;
private boolean observable;
private JoinPoint joinPoint;
private ObservableExecutionMode observableExecutionMode;
public Builder hystrixCollapser(HystrixCollapser hystrixCollapser) {
this.hystrixCollapser = hystrixCollapser;
return this;
}
public Builder hystrixCommand(HystrixCommand hystrixCommand) {
this.hystrixCommand = hystrixCommand;
return this;
}
public Builder method(Method method) {
this.method = method;
return this;
}
public Builder cacheKeyMethod(Method cacheKeyMethod) {
this.cacheKeyMethod = cacheKeyMethod;
return this;
}
public Builder fallbackMethod(Method fallbackMethod) {
this.fallbackMethod = fallbackMethod;
return this;
}
public Builder fallbackExecutionType(ExecutionType fallbackExecutionType) {
this.fallbackExecutionType = fallbackExecutionType;
return this;
}
public Builder fallback(boolean fallback) {
this.fallback = fallback;
return this;
}
public Builder extendedParentFallback(boolean extendedParentFallback) {
this.extendedParentFallback = extendedParentFallback;
return this;
}
public Builder ajcMethod(Method ajcMethod) {
this.ajcMethod = ajcMethod;
return this;
}
public Builder obj(Object obj) {
this.obj = obj;
return this;
}
public Builder proxyObj(Object proxy) {
this.proxyObj = proxy;
return this;
}
public Builder args(Object[] args) {
this.args = args;
return this;
}
public Builder closure(Closure closure) {
this.closure = closure;
return this;
}
public Builder executionType(ExecutionType executionType) {
this.executionType = executionType;
return this;
}
public Builder collapserExecutionType(ExecutionType collapserExecutionType) {
this.collapserExecutionType = collapserExecutionType;
return this;
}
public Builder defaultGroupKey(String defGroupKey) {
this.defaultGroupKey = defGroupKey;
return this;
}
public Builder defaultCommandKey(String defCommandKey) {
this.defaultCommandKey = defCommandKey;
return this;
}
public Builder defaultThreadPoolKey(String defaultThreadPoolKey) {
this.defaultThreadPoolKey = defaultThreadPoolKey;
return this;
}
public Builder defaultCollapserKey(String defCollapserKey) {
this.defaultCollapserKey = defCollapserKey;
return this;
}
public Builder defaultProperties(@Nullable DefaultProperties defaultProperties) {
this.defaultProperties = defaultProperties;
return this;
}
public Builder joinPoint(JoinPoint joinPoint) {
this.joinPoint = joinPoint;
return this;
}
public Builder extendedFallback(boolean extendedFallback) {
this.extendedFallback = extendedFallback;
return this;
}
public Builder observable(boolean observable) {
this.observable = observable;
return this;
}
public Builder observableExecutionMode(ObservableExecutionMode observableExecutionMode) {
this.observableExecutionMode = observableExecutionMode;
return this;
}
public MetaHolder build() {
return new MetaHolder(this);
}
}