
com.moon.core.util.Builder Maven / Gradle / Ivy
package com.moon.core.util;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* 通用建造者,使用方法:
*
* 摘自:https://mp.weixin.qq.com/s/VzkdhRUUAGgKpTWspeypkA
*
* package com.example;
*
* public class Employee {
*
* private String username;
* private String address;
* private int age;
*
* public void setUsername(String username) {
* this.username = username;
* }
*
* public void setAge(int age) {
* this.age = age;
* }
*
* // 省略其他 setter 和 getter 方法
*
* public static void main(String[] args) {
* Employee employee = Builder.of(Employee::new)
* .with(Employee::setUsername, "username")
* .with(Employee::setAge, 24)
* // 其他 setter
* .build();
* }
* }
*
*
* @author benshaoye
*/
public final class Builder {
private final Supplier creator;
private List> setters;
public Builder(Supplier creator) { this.creator = creator; }
private List> ensureSetters() {
return setters == null ? (setters = new ArrayList<>()) : setters;
}
public static Builder of(Supplier creator) {
return new Builder<>(creator);
}
public Builder with(Setter setter, P param) {
ensureSetters().add(it -> setter.set(it, param));
return this;
}
public Builder with(BiSetter setter, P1 p1, P2 p2) {
ensureSetters().add(it -> setter.set(it, p1, p2));
return this;
}
public Builder with(MultiSetter setter, P1 p1, P2 p2, P3 p3) {
ensureSetters().add(it -> setter.set(it, p1, p2, p3));
return this;
}
public T build() {
if (creator == null) {
return null;
}
T instance = creator.get();
List> setters = this.setters;
if (setters != null) {
for (Consumer setter : setters) {
setter.accept(instance);
}
}
return instance;
}
public interface Setter {
/**
* 设置值
*
* @param it 对象
* @param param 值
*/
void set(T it, P param);
}
public interface BiSetter {
/**
* 设置值
*
* @param it 对象
* @param p1 值
* @param p2 值
*/
void set(T it, P1 p1, P2 p2);
}
public interface MultiSetter {
/**
* 设置值
*
* @param it 对象
* @param p1 值
* @param p2 值
* @param p3 值
*/
void set(T it, P1 p1, P2 p2, P3 p3);
}
}