Design Pattern Builder là một mẫu thiết kế thuộc nhóm Creational Patterns trong Java, dùng để tạo đối tượng phức tạp từng bước một. Nó rất hữu ích khi một object có nhiều tham số (đặc biệt là khi một số tham số là tùy chọn), giúp code dễ đọc, dễ bảo trì, và tránh việc phải dùng quá nhiều constructor hoặc setter.
Tổng quan về Builder Pattern
Khi một class có quá nhiều constructor (overloading) hoặc nhiều trường cần set, việc khởi tạo sẽ khó đọc và dễ gây lỗi.
Cách thông thường:
User user = new User("John", "Doe", 30, "USA", "Engineer");
=> Khó đọc, và bạn phải nhớ đúng thứ tự các tham số.
Cách sử dụng Builder:
User user = User.builder() .firstName("John") .lastName("Doe") .age(30) .country("USA") .occupation("Engineer") .build();
Cách triển khai Builder Pattern bằng tay
public class User { private String firstName; private String lastName; private int age; private String country; public static class Builder { private String firstName; private String lastName; private int age; private String country; public Builder firstName(String firstName) { this.firstName = firstName; return this; } public Builder lastName(String lastName) { this.lastName = lastName; return this; } public Builder age(int age) { this.age = age; return this; } public Builder country(String country) { this.country = country; return this; } public User build() { return new User(this); } } private User(Builder builder) { this.firstName = builder.firstName; this.lastName = builder.lastName; this.age = builder.age; this.country = builder.country; }
}
Hỗ trợ từ Lombok (Khuyên dùng với Spring Boot)
Spring Boot projects thường dùng Lombok để giảm boilerplate (mâu thuẫn - mã lặp đi lặp lại không thay đổi nhiều) code:
Cài Lombok (pom.xml)
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>new version (lên google nhé)</version> <scope>provided</scope>
</dependency>
Sử dụng Lombok
import lombok.Builder;
import lombok.Data; @Data
@Builder
public class User { private String firstName; private String lastName; private int age; private String country;
}