Java8通用Builder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class Builder<T> {
private final Supplier<T> instantiator;
private List<Consumer<T>> setterList = new ArrayList<>();

private Builder(Supplier<T> instantiator) {
this.instantiator = instantiator;
}

public static <T> Builder<T> of(Supplier<T> instantiator) {
return new Builder<>(instantiator);
}

public <P> Builder<T> with(IOneParamSetter<T, P> setter, P p) {
Consumer<T> c = instance -> setter.accept(instance, p);
setterList.add(c);
return this;
}

public <P0, P1> Builder<T> with(ITwoParamSetter<T, P0, P1> setter, P0 p0, P1 p1) {
Consumer<T> c = instance -> setter.accept(instance, p0, p1);
setterList.add(c);
return this;
}

public T build() {
T value = instantiator.get();
setterList.forEach(setter -> setter.accept(value));
setterList.clear();
return value;
}

@FunctionalInterface
public interface IOneParamSetter<T, P> {
void accept(T t, P p);
}

@FunctionalInterface
public interface ITwoParamSetter<T, P0, P1> {
void accept(T t, P0 p0, P1 p1);
}

}

使用示例:

1
2
3
4
5
Person person = Builder.of(Person :: new)
.with(Person :: setName, "zero")
.with(Person :: setAge, "18")
.build();
System.out.println(person);

参考:
https://blog.csdn.net/cradle2006/article/details/95073133
https://blog.csdn.net/xiaoxiaole0313/article/details/104890343?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase