---
# System prepended metadata

title: Design Pattern - Builder

---

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

```
```