定义:

  • 指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

    特点:

  • 各个具体的建造者相互独立,有利于系统的扩展。(优点)

  • 客户端不必知道产品内部组成的细节,便于控制细节风险。(优点)
  • 产品的组成部分必须相同,这限制了其使用范围。(缺点)
  • 如果产品的内部变化复杂,该模式会增加很多的建造者类。(缺点)

    通常适用场景:

  • 创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。

  • 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

    demo代码:

  • 中规中矩的建造者模式

    1. public class User {
    2. private String name;
    3. private String password;
    4. private String nickName;
    5. private int age;
    6. private User(String name, String password, String nickName, int age) {
    7. this.name = name;
    8. this.password = password;
    9. this.nickName = nickName;
    10. this.age = age;
    11. }
    12. public static UserBuilder builder() {
    13. return new UserBuilder();
    14. }
    15. public static class UserBuilder {
    16. private String name;
    17. private String password;
    18. private String nickName;
    19. private int age;
    20. private UserBuilder() {
    21. }
    22. public UserBuilder name(String name) {
    23. this.name = name;
    24. return this;
    25. }
    26. public UserBuilder password(String password) {
    27. this.password = password;
    28. return this;
    29. }
    30. public UserBuilder nickName(String nickName) {
    31. this.nickName = nickName;
    32. return this;
    33. }
    34. public UserBuilder age(int age) {
    35. this.age = age;
    36. return this;
    37. }
    38. public User build() {
    39. return new User(name, password, nickName, age);
    40. }
    41. }
    42. }
  • 注解版(使用lombok @Builder)

    1. @Builder
    2. class User {
    3. private String name;
    4. private String password;
    5. private String nickName;
    6. private int age;
    7. }
  • 只想用链式写法,不要建造者模式(使用lombok @Accessors(chain = true) 和 @Data) ```java @Accessors(chain = true) @Data public class User { private String name; private String password; private String nickName; private int age;

} public void main(String[] args) { User user= new User().setName(“张三”).setNickName(“小张”).setPassword(“123456”).setAge(18); }

  1. - 测试
  2. ```java
  3. public static void main(String[] args) {
  4. User user = User.builder()
  5. .name("张三")
  6. .nickName("小张")
  7. .password("123456")
  8. .age(18)
  9. .build();
  10. }