Builder模式
- Builder模式也称为建造者模式
- StringBuilder、lombok @Builder 大家应该都不陌生,在对象初始化属性时,使用链式编程可以省去调用大量的setter方法,代码可读性更高。那么链式编程是如何实现的,以下Demo展示了主要的实现过程。
一、定义Builder接口,使用泛型增加代码扩展性
public interface Builder<T> {
T build();
}
二、定义Bean
public class Person {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private Person(PersonBuilder builder) {
this.id = builder.id;
this.name = builder.name;
}
public static PersonBuilder builder() {
return new PersonBuilder();
}
public static class PersonBuilder implements Builder<Person> {
private String id;
private String name;
public PersonBuilder id(String id) {
this.id = id;
return this;
}
public PersonBuilder name(String name) {
this.name = name;
return this;
}
@Override
public Person build() {
return new Person(this);
}
}
}
三、测试类
public class TestBuilder {
public static void main(String[] args) {
Person person1 = Person.builder().id("100001").name("李四").build();
System.out.println(Optional.ofNullable(person1).map(Person::getId).orElse("100002"));
System.out.println(Optional.ofNullable(person1).map(Person::getName).orElse("张三"));
Person person2 = Person.builder().id("100001").build();
System.out.println(Optional.ofNullable(person2).map(Person::getId).orElse("100002"));
System.out.println(Optional.ofNullable(person2).map(Person::getName).orElse("张三"));
}
}
优点:
- 链式调用,优雅、清晰、一目了然;
- 一行代码完成对象创建,避免了多行代码赋值过程出错;
- 省去了大量冗余变量,避免变量复制出错;
缺点:
- 需要冗余的 Builder 类,以及大量相等重复的成员变量,大大增加了代码量,维护难度相对较大;
- 只适合一次赋值创建对象,多次赋值的场景还需要新增 set 方法配合,不是很灵活
即使团队不允许使用lombok,这种编码风格也是值得推荐的。