2016-09-07 16 views
5

khi sử dụng Builder Pattern tại sao tôi không nên sử dụng lại đối tượng người xây dựng để truy cập cấu hình đối tượng? Ví dụ:Khi sử dụng một Mẫu Builder tại sao tôi không nên sử dụng lại đối tượng trình xây dựng để truy cập cấu hình đối tượng?

cách bình thường:

ObjectA(ObjectBuilder b) { 
    this.a = b.getA(); 
} 
public Object getA(){ 
    return this.a; 
} 

Nhưng tại sao tôi không thể chỉ cần sử dụng này:

ObjectA(ObjectBuilder b) { 
    this.builder = b; 
} 
public Object getA(){ 
    return this.builder.getA(); 
} 

Cảm ơn :)

+6

Toàn bộ điểm về cách sử dụng trình xây dựng là xây dựng các đối tượng bất biến: người xây dựng có thể thay đổi được, thứ mà nó xây dựng không phải là. Nếu bạn ủy quyền cho trình xây dựng, cá thể của bạn có thể thay đổi lại: bất kỳ ai có tham chiếu đến cùng một cá thể 'ObjectBuilder' đều có thể thay đổi' ObjectA' của bạn. Nếu bạn muốn có một đối tượng có thể thay đổi được, không cần người xây dựng: chỉ có các bộ định vị trên 'ObjectA' của bạn. –

+0

Đó là một câu trả lời khá hay. Đúng là tôi không muốn A bị thay đổi sau hàm tạo. Đó là lý do tại sao tôi đã sử dụng nhà xây dựng ngay từ đầu. –

Trả lời

7

Một lý do lớn cho việc sử dụng một người thợ xây là để xây dựng một đối tượng bất biến: người xây dựng có thể thay đổi được, thứ mà nó xây dựng không phải là (nhất thiết).

Nếu bạn ủy quyền cho người xây dựng, trường hợp của bạn sẽ có thể thay đổi lại: bất kỳ ai có tham chiếu đến cùng một phiên bản ObjectBuilder đều có thể thay đổi ObjectA của bạn. Điều này có nghĩa là bất kỳ kiểm tra nào bạn thực hiện về tính hợp lệ của trạng thái ObjectA tại thời gian xây dựng có thể bị vô hiệu.

Nếu bạn muốn một đối tượng có thể thay đổi, không cần thiết cho người xây dựng: chỉ có các bộ định vị trên ObjectA của bạn.

+2

Nếu bạn muốn một đối tượng có thể thay đổi, có _less_ cần cho trình tạo. Nhà xây dựng là tốt cho nhiều hơn là bất biến. – jaco0646

+0

@AndyTurner Tôi có câu hỏi tương tự về mẫu Builder [ở đây] (http://stackoverflow.com/questions/41206286/how-to-clone-old-builder-to-make-a-new-builder-object). Muốn xem nếu bạn có thể giúp tôi ra khỏi đó. –

Các vấn đề liên quan