### Đặc điểm của Builder Pattern #### Khởi tạo đối tượng phức tạp #### Dùng khi object có nhiều tham số (cả bắt buộc và tùy chọn). #### Tránh việc tạo ra constructor dài ngoằng hoặc nhiều overload khó quản lý. #### Đối tượng bất biến (immutable) Thường các field được khai báo private final. Khi build xong thì object không thay đổi được → an toàn, rõ ràng. Code dễ đọc, dễ hiểu ### Thay vì nhớ thứ tự tham số trong constructor: ``` new User(1, "A", "a@gmail.com", "0123", "HN", 25, "Nam"); ``` Bạn có thể viết rõ ràng: ``` new User.Builder(1, "A") .email("a@gmail.com") .phone("0123") .age(25) .build(); ``` #### Hỗ trợ chain method Các setter trong Builder thường return lại this, nên có thể viết chain gọn gàng. Coding : ```javascript // Lớp User với Builder class User { // Các thuộc tính private final int id; private final String name; private final String email; private final String phone; private final String address; private final int age; private final String gender; // private constructor, chỉ có Builder gọi được private User(Builder builder) { this.id = builder.id; this.name = builder.name; this.email = builder.email; this.phone = builder.phone; this.address = builder.address; this.age = builder.age; this.gender = builder.gender; } // static inner class Builder public static class Builder { private final int id; // bắt buộc private final String name; // bắt buộc private String email; private String phone; private String address; private int age; private String gender; public Builder(int id, String name) { this.id = id; this.name = name; } public Builder email(String email) { this.email = email; return this; } public Builder phone(String phone) { this.phone = phone; return this; } public Builder address(String address) { this.address = address; return this; } public Builder age(int age) { this.age = age; return this; } public Builder gender(String gender) { this.gender = gender; return this; } public User build() { return new User(this); } } @Override public String toString() { return "User{id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", phone='" + phone + '\'' + ", address='" + address + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } } ``` ```