建造者模式与Lombok引言建造者模式是一种创建型设计模式通过将复杂对象的构建与其表示分离使得同样的构建过程可以创建不同的表示。Lombok通过注解自动化了建造者模式的代码生成大大简化了Java开发。本文将详细介绍建造者模式的实现方式以及Lombok的Builder注解用法。一、传统建造者模式1.1 内部Builder类public class User { private final String username; private final String email; private final int age; private final String address; private final ListString roles; private User(Builder builder) { this.username builder.username; this.email builder.email; this.age builder.age; this.address builder.address; this.roles Collections.unmodifiableList( new ArrayList(builder.roles)); } public static Builder builder() { return new Builder(); } public static class Builder { private String username; private String email; private int age; private String address; private ListString roles new ArrayList(); public Builder username(String username) { this.username username; return this; } public Builder email(String email) { this.email email; return this; } public Builder age(int age) { this.age age; return this; } public Builder address(String address) { this.address address; return this; } public Builder roles(ListString roles) { this.roles roles; return this; } public Builder addRole(String role) { this.roles.add(role); return this; } public User build() { if (username null || username.isEmpty()) { throw new IllegalStateException(username is required); } return new User(this); } } // Getters public String getUsername() { return username; } public String getEmail() { return email; } public int getAge() { return age; } public String getAddress() { return address; } public ListString getRoles() { return roles; } } // 使用 User user User.builder() .username(john) .email(johnexample.com) .age(25) .address(Beijing) .addRole(ADMIN) .addRole(USER) .build();1.2 分离Builder接口public interface UserBuilder { UserBuilder username(String username); UserBuilder email(String email); UserBuilder age(int age); UserBuilder address(String address); UserBuilder addRole(String role); User build(); } public class UserBuilderImpl implements UserBuilder { private String username; private String email; private int age; private String address; private ListString roles new ArrayList(); Override public UserBuilder username(String username) { this.username username; return this; } Override public User build() { return new User(this); } // 其他方法... } public class Director { private final UserBuilder builder; public Director(UserBuilder builder) { this.builder builder; } public User buildDefaultUser() { return builder .username(default) .age(18) .build(); } }二、Lombok Builder2.1 基本用法Builder Data public class Product { private Long id; private String name; private String description; private BigDecimal price; private String category; private ListString tags; private boolean active; } // Lombok自动生成 Product product Product.builder() .id(1L) .name(iPhone) .price(new BigDecimal(9999)) .category(Electronics) .build();2.2 注解参数Builder(builderClassName ProductBuilder, builderMethodName productBuilder, buildMethodName create, toBuilder true, setterPrefix with) Data public class Config { private String host; private int port; private boolean ssl; } // 使用 Config config Config.productBuilder() .withHost(localhost) .withPort(8080) .withSsl(true) .create();2.3 集合属性处理Builder public class Order { private Long id; private String orderNo; Singular private ListOrderItem items; Singular(addedTag) private SetString tags; } // 使用 Order order Order.builder() .id(1L) .orderNo(ORD001) .item(new OrderItem()) // 添加单个 .addedTag(vip) // 使用别名 .build();三、Builder.Default3.1 默认值设置Builder Data public class ServerConfig { private String host; private int port; Builder.Default private int timeout 30000; Builder.Default private boolean retryEnabled true; Builder.Default private ListString allowedOrigins Arrays.asList(*); }3.2 Builder中覆写Builder Data public class DatabaseConfig { private String url; private String username; private String password; Builder.Default private int maxPoolSize 10; Builder.Default private int minIdle 5; public static class Builder { private int maxPoolSize 10; private int minIdle 5; public Builder maxPoolSize(int size) { this.maxPoolSize size; return this; } } }四、Lombok与Spring4.1 Builder with AutowiredService public class OrderService { private final OrderRepository orderRepository; private final PaymentGateway paymentGateway; Autowired public OrderService(OrderRepository orderRepository, PaymentGateway paymentGateway) { this.orderRepository orderRepository; this.paymentGateway paymentGateway; } }4.2 配置类中使用Configuration Builder public class DataSourceConfig { private String url; private String username; private String password; private int maxPoolSize; Bean public DataSource dataSource() { return DataSourceBuilder.create() .url(url) .username(username) .password(password) .build(); } } // 配置 Bean public DataSourceConfig dataSourceConfig() { return DataSourceConfig.builder() .url(jdbc:mysql://localhost:3306/test) .username(root) .password(password) .maxPoolSize(20) .build(); }4.3 ConfigurationPropertiesBuilder ConfigurationProperties(prefix app.service) public class ServiceProperties { private String baseUrl; private int timeout; Builder.Default private int retryCount 3; } Configuration EnableConfigurationProperties(ServiceProperties.class) public class ServiceConfig { private final ServiceProperties properties; Bean public ServiceClient serviceClient() { return ServiceClient.builder() .baseUrl(properties.getBaseUrl()) .timeout(properties.getTimeout()) .retryCount(properties.getRetryCount()) .build(); } }五、复杂对象构建5.1 嵌套BuilderBuilder Data public class Company { private Long id; private String name; Builder.Default private ListDepartment departments new ArrayList(); } Builder Data public class Department { private Long id; private String name; Builder.Default private ListEmployee employees new ArrayList(); } // 构建 Company company Company.builder() .id(1L) .name(TechCorp) .department(Department.builder() .id(1L) .name(Engineering) .employee(Employee.builder() .name(John) .build()) .build()) .build();5.2 Builder转换Builder Data public class User { private String username; private String email; private String password; } Builder(toBuilder true) Data public class UserDTO { private String username; private String email; public static UserDTO fromUser(User user) { return user.toBuilder() .build(); // 复制到新类型 } }六、最佳实践6.1 不可变对象Builder Data public final class ImmutableUser { private final Long id; private final String username; private final String email; // Lombok 1.18.20 支持final字段 }6.2 验证逻辑Builder Data public class ValidatedUser { private String username; private String email; private int age; public static class Builder { public ValidatedUser build() { ValidatedUser user new ValidatedUser(); user.username this.username; user.email this.email; user.age this.age; validate(user); return user; } private void validate(ValidatedUser user) { if (user.username null || user.username.isEmpty()) { throw new IllegalArgumentException(Username required); } if (user.email ! null !user.email.contains()) { throw new IllegalArgumentException(Invalid email); } if (user.age 0 || user.age 150) { throw new IllegalArgumentException(Invalid age); } } } }6.3 Builder模式选择public class FlexibleBuilderT { private final SupplierT factory; private final ListConsumerT operations new ArrayList(); public FlexibleBuilder(SupplierT factory) { this.factory factory; } public V FlexibleBuilderT with(FunctionV, T setter, V value) { operations.add(obj - setter.apply(value)); return this; } public T build() { T obj factory.get(); operations.forEach(op - op.accept(obj)); return obj; } } // 使用 User user new FlexibleBuilder(User::new) .with(User::setUsername, john) .with(User::setEmail, johnexample.com) .build();总结建造者模式是创建复杂对象的有力工具Lombok的Builder注解大大简化了代码编写。通过合理使用Builder、Singular、Builder.Default等注解可以构建灵活且类型安全的对象创建方式。在Spring应用中结合ConfigurationProperties和Validated可以实现优雅的配置对象定义。