设计模式 实现一个通用建造者

建造者模式,在设计模式中属创建型模式范畴,意在将一个复杂对象的构建过程与其表现相互分离,逐步构建复杂对象,但一个复杂对象去对应一个 builder 感觉略显“奢侈”,考虑有无可能,抽取一个通用 builder,用于所有复杂对象的构建过程,见下文。
/**
 * @author zailushang
 */
public class Builder<T> {
    // 持有一个通用类型引用
    private T t;

    private Builder(T t) {
        this.t = t;
    }

    /**
     * 静态方法创建 builder,需要提供一个供给型接口,即一个创建对象的无参构造
     */
    public static <T> Builder<T> of(Supplier<T> supplier) {
        return new Builder<>(supplier.get());
    }

    /**
     * 设置字段值
     * 其中 value 与 {@link Setter} 通过泛型强绑定
     * 继续返回 builder 实现链式调用
     */
    public <V> Builder<T> field(Setter<T, V> setter, V value) {
       	setter.accept(t, value);
        return this;
    }

    public T build() {
        return this.t;
    }

    /**
     * 自定义函数式接口,用于承接一个对象的 set 方法
     */
    public interface Setter<T, V> extends BiConsumer<T, V> {
    }
}

@Data
class Student {
    private String name;
    private Integer age;
}

@Data
class Teacher {
    private String name;
    private Integer age;
    private String phone;
}

public class Main {
	// 最终调用效果,干净又卫生
    public static void main(String[] args) {
        var stu = Builder.of(Student::new)
                .field(Student::setName, "小李")
                .field(Student::setAge, 10)
                .build();
        System.out.println(stu);

        var tea = Builder.of(Teacher::new)
                .field(Teacher::setName, "王老师")
                .field(Teacher::setAge, 20)
                .field(Teacher::setPhone, "13333333333")
                .build();
        System.out.println(tea);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值