设计模式之构建者模式
介绍两种写法
1.lombok构造器
public class Builder {
private int age;
private String name;
private Builder(){}
public static Builder.BuilderHolder builder(){
return new Builder.BuilderHolder();
}
public static class BuilderHolder{
private int age;
private String name;
public BuilderHolder age(int age){
this.age = age;
return this;
}
public BuilderHolder name(String name){
this.name = name;
return this;
}
public Builder build(){
Builder builder = new Builder();
builder.age = this.age;
builder.name = this.name;
return builder;
}
}
}
测试类
public class BuilderTest {
public static void main(String[] args) {
Builder builder = Builder.builder()
.age(1)
.name("张三")
.build();
}
}
2.自定义构造器
public class Builder2<T> {
private final Supplier<T> instance;
private final List<Consumer<T>> modifiers = new ArrayList<>();
public Builder2(Supplier<T> instance) {
this.instance = instance;
}
public static <T> Builder2<T> of(Supplier<T> instance) {
return new Builder2<>(instance);
}
public <P> Builder2<T> with(BiConsumer<T, P> consumer, P p) {
Consumer<T> c = instance -> consumer.accept(instance, p);
modifiers.add(c);
return this;
}
public T build() {
T value = instance.get();
modifiers.forEach(modifiers -> modifiers.accept(value));
modifiers.clear();
return value;
}
}
测试类
public class Test1 {
public static void main(String[] args) {
MsoShareOrder msoShareOrder = Builder2.of(MsoShareOrder::new)
.with(MsoShareOrder::setAgentName, "111")
.with(MsoShareOrder::setAgentNo, "666")
.with(MsoShareOrder::setMerNo, "A111")
.build();
}
}