Gần đây tôi đã xóa một câu trả lời java của tôi trên Code Review , bắt đầu như thế này:
private Person(PersonBuilder builder) {
Dừng lại. Cờ đỏ. Một PersonBuilder sẽ xây dựng một Người; nó biết về một người. Lớp Person không nên biết bất cứ điều gì về PersonBuilder - đó chỉ là một loại bất biến. Bạn đã tạo ra một khớp nối tròn ở đây, trong đó A phụ thuộc vào B phụ thuộc vào A.
Người chỉ nên lấy thông số của nó; một khách hàng sẵn sàng tạo ra một Người mà không cần xây dựng nên sẽ có thể làm điều đó.
Tôi đã bị tát với một downvote, và nói rằng (trích dẫn) Cờ đỏ, tại sao? Việc triển khai ở đây có hình dạng tương tự như Joshua Bloch đã thể hiện trong cuốn sách "Java hiệu quả" của mình (mục số 2).
Vì vậy, có vẻ như One Right Way trong việc triển khai Mẫu xây dựng trong Java là làm cho trình xây dựng thành một kiểu lồng nhau (đây không phải là câu hỏi này về vấn đề gì), sau đó tạo ra sản phẩm (lớp của đối tượng được xây dựng ) phụ thuộc vào người xây dựng , như thế này:
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
Cùng một trang Wikipedia cho cùng một mẫu Builder có cách triển khai khác nhau (và linh hoạt hơn nhiều) cho C #:
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
Như bạn có thể thấy, sản phẩm ở đây không biết gì về một Builder
lớp và với tất cả những gì nó quan tâm, nó có thể được khởi tạo bằng một cuộc gọi trực tiếp của nhà xây dựng, một nhà máy trừu tượng, ... hoặc một người xây dựng - theo như tôi hiểu, sản phẩm của một mô hình sáng tạo không bao giờ cần biết bất cứ điều gì về những gì tạo ra nó.
Tôi đã được phục vụ đối số phản đối (rõ ràng được bảo vệ rõ ràng trong cuốn sách của Bloch) rằng một mẫu xây dựng có thể được sử dụng để làm lại một loại có thể có một hàm tạo với hàng tá đối số tùy chọn. Vì vậy, thay vì bám vào những gì tôi nghĩ tôi biết tôi đã nghiên cứu một chút trên trang web này và thấy rằng như tôi nghi ngờ, lập luận này không giữ được nước .
Vậy thỏa thuận là gì? Tại sao lại đưa ra các giải pháp kỹ thuật quá mức cho một vấn đề thậm chí không tồn tại ngay từ đầu? Nếu chúng ta đưa Joshua Bloch ra khỏi bệ của mình trong một phút, chúng ta có thể đưa ra một lý do duy nhất, hợp lệ để ghép hai loại bê tông và gọi đó là cách thực hành tốt nhất không?
Đây là tất cả các chương trình đào tạo hàng hóa đối với tôi.