经常碰见的 XxxBuilder 的类,通常都是建造者模式的产物。
套路就是先 new 一个 Builder,然后可以链式地调用一堆方法,最后再调用一次 build() 方法,我们需要的对象就有了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| class User { private String name; private String password; private String nickName; private int age;
private User(String name, String password, String nickName, int age) { this.name = name; this.password = password; this.nickName = nickName; this.age = age; } public static UserBuilder builder() { return new UserBuilder(); }
public static class UserBuilder { private String name; private String password; private String nickName; private int age;
private UserBuilder() { }
public UserBuilder name(String name) { this.name = name; return this; }
public UserBuilder password(String password) { this.password = password; return this; }
public UserBuilder nickName(String nickName) { this.nickName = nickName; return this; }
public UserBuilder age(int age) { this.age = age; return this; }
public User build() { if (name == null || password == null) { throw new RuntimeException("用户名和密码必填"); } if (age <= 0 || age >= 150) { throw new RuntimeException("年龄不合法"); } if (nickName == null) { nickName = name; } return new User(name, password, nickName, age); } } }
|
核心是:先把所有的属性都设置给 Builder,然后 build() 方法的时候,将这些属性复制给实际产生的对象。
客户端调用:
1 2 3 4 5 6 7 8 9
| public class Main { public static void main(String[] args) { User d = User.builder() .name("foo") .password("pAss12345") .age(25) .build(); } }
|
参考