为什么要使用建造者模式?
- 将复杂对象的构造和展示相分离,使用不同的建造者的实现能得到不同的结果
- 避免过多的构造函数和setter方法
- 更方便构造不可变对象,线程安全
ps:使用lombok的@Builder注解可以自动给我们生成建造者模式代码
package com.kuaikan.sample.springboot.aop;public class User { private final int age; // optional private final String phone; // optional private final String address; // optional private User(UserBuilder builder) { this.age = builder.age; this.phone = builder.phone; this.address = builder.address; } public int getAge() { return age; } public String getPhone() { return phone; } public String getAddress() { return address; } public static class UserBuilder { private int age; private String phone; private String address; private UserBuilder() { } public static UserBuilder newBuilder() { return new UserBuilder(); } public UserBuilder age(int age) { this.age = age; return this; } public UserBuilder phone(String phone) { this.phone = phone; return this; } public UserBuilder address(String address) { this.address = address; return this; } public User build() { return new User(this); } } public static void main(String[] args) { User user = UserBuilder.newBuilder() .address("") .age(11) .phone("123") .build(); }}
建造者模式优点
- User构造方法是私有的,这意味着该类不能在客户端代码里直接实例化。
- 该类现在又是不可变的了。所有属性都是final类型的,在构造方法里面被赋值。另外,我们只为它们提供了getter方法。
- builder类使用流式接口风格,让客户端代码阅读起来更容易(我们马上就会看到一个它的例子)。
- builder类构造方法只接收必须属性,为了确保这些属性在构造方法里赋值,只有这些属性被定义成final类型。