Tôi đã thấy nhiều triển khai của mẫu Builder (chủ yếu là trong Java). Tất cả chúng đều có một lớp thực thể (giả sử một Person
lớp) và một lớp xây dựng PersonBuilder
. Trình xây dựng "sắp xếp" một loạt các trường và trả về một new Person
với các đối số được truyền. Tại sao chúng ta rõ ràng cần một lớp xây dựng, thay vì đặt tất cả các phương thức xây dựng trong Person
chính lớp đó?
Ví dụ:
class Person {
private String name;
private Integer age;
public Person() {
}
Person withName(String name) {
this.name = name;
return this;
}
Person withAge(int age) {
this.age = age;
return this;
}
}
Tôi chỉ có thể nói Person john = new Person().withName("John");
Tại sao cần một PersonBuilder
lớp học?
Lợi ích duy nhất tôi thấy, là chúng ta có thể khai báo các Person
trường như final
, do đó đảm bảo tính bất biến.
withName
trả lại một bản sao của Người chỉ với trường tên đã thay đổi. Nói cách khác, Person john = new Person().withName("John");
có thể hoạt động ngay cả khi Person
không thay đổi (và đây là mô hình phổ biến trong lập trình chức năng).
void
phương pháp. Vì vậy, ví dụ, nếu Person
có một phương thức in tên của họ, bạn vẫn có thể xâu chuỗi nó với Giao diện trôi chảy person.setName("Alice").sayName().setName("Bob").sayName()
. Nhân tiện, tôi chú thích những người trong JavaDoc với chính xác đề xuất của bạn @return Fluent interface
- nó đủ chung chung và rõ ràng khi áp dụng cho bất kỳ phương thức nào thực hiện return this
khi kết thúc thực thi và nó khá rõ ràng. Vì vậy, một Builder cũng sẽ làm một giao diện trôi chảy.
chainable setters
: D