
cn.micro.core.util.Builder Maven / Gradle / Ivy
package cn.micro.core.util;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* 通用的 Builder 模式构建器
*
* @param
*/
public final class Builder {
private final Supplier instantiator;
private final List> modifiers = new ArrayList<>();
private Builder() {
this.instantiator = null;
}
private Builder(Supplier instantiator) {
this.instantiator = instantiator;
}
private T instance;
public static Builder of(Supplier instantiator) {
return new Builder<>(instantiator);
}
public static Builder of(T instance) {
Builder builder = new Builder<>();
builder.instance = instance;
return builder;
}
public Builder with(Consumer1 consumer, P1 p1) {
Consumer c = instance -> consumer.accept(instance, p1);
modifiers.add(c);
return this;
}
public Builder with(Consumer2 consumer, P1 p1, P2 p2) {
Consumer c = instance -> consumer.accept(instance, p1, p2);
modifiers.add(c);
return this;
}
public Builder with(Consumer3 consumer, P1 p1, P2 p2, P3 p3) {
Consumer c = instance -> consumer.accept(instance, p1, p2, p3);
modifiers.add(c);
return this;
}
public T build() {
T value = null != instantiator ? instantiator.get() : instance;
modifiers.forEach(modifier -> modifier.accept(value));
modifiers.clear();
return value;
}
@SuppressWarnings("unchecked")
public T newBuild() {
T value = null != instantiator ? instantiator.get() : instance;
T newValue;
Class targetClass = (Class) value.getClass();
newValue = BeanUtil.newInstance(targetClass);
BeanUtils.copyProperties(value, newValue);
T finalNewValue = newValue;
modifiers.forEach(modifier -> modifier.accept(finalNewValue));
modifiers.clear();
return newValue;
}
/**
* 1 参数 Consumer
*/
@FunctionalInterface
public interface Consumer1 {
void accept(T t, P1 p1);
}
/**
* 2 参数 Consumer
*/
@FunctionalInterface
public interface Consumer2 {
void accept(T t, P1 p1, P2 p2);
}
/**
* 3 参数 Consumer
*/
@FunctionalInterface
public interface Consumer3 {
void accept(T t, P1 p1, P2 p2, P3 p3);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy