优点:
- 使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 具体的建造者类之间是相互独立的,这有利于系统的扩展。
- 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
个人理解是 主要是可读性较高
缺点:
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
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(); // 这里执行想要执行的业务
}