java设计模式之一建造者模式\Consumer

251 阅读1分钟

优点:

  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  • 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。

个人理解是 主要是可读性较高

缺点:

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

Consumer

java8里面consumer&BiConsumer也是函数式接口,从代码上看,consumer只有一个入参,没有返回值;BiConsumer两个入参,没有返回值。

举个例子:


import lombok.AllArgsConstructor;

import java.util.function.Consumer;

@AllArgsConstructor
public final class FastAutoGeneratorStudent {
    private final SchoolModel.SchoolModelBuilder schoolModelBuilder;
    private final ClassModel.ClassModelBuilder classModelBuilder;
    private final TeacherModel.TeacherModelBuilder teacherModelBuilder;

    public static FastAutoGeneratorStudent create(String name){
        return new FastAutoGeneratorStudent(SchoolModel.builder(), ClassModel.builder(), TeacherModel.builder());
    }

    public FastAutoGeneratorStudent schoolModel(Consumer<SchoolModel.SchoolModelBuilder> consumer){
        consumer.accept(this.schoolModelBuilder);
        return this;
    }
    public FastAutoGeneratorStudent classModel(Consumer<ClassModel.ClassModelBuilder> consumer){
        consumer.accept(this.classModelBuilder);
        return this;
    }
    public FastAutoGeneratorStudent teacherModel(Consumer<TeacherModel.TeacherModelBuilder> consumer){
        consumer.accept(this.teacherModelBuilder);
        return this;
    }

    public void excute(){
        //这里可以封装另一个类, 组装该类build需要的参数实体, 然后写个excute执行对应的业务方法即可。
    }

}

具体使用

public void test() {

    FastAutoGeneratorStudent
            .create("张三")
            .schoolModel(builder -> {
                builder.schoolName("哈佛大学")
                        .schoolName("hf0001");
            })
            .classModel(builder -> {
                builder.className("大一 14班");
            })
            .teacherModel(builder -> {
                builder.teacherName("米开朗基德");
            })
            .excute(); // 这里执行想要执行的业务

}