### Đặ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 + '\'' +
'}';
}
}
```
```