All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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