ฉันเห็นการใช้งานหลายอย่างของรูปแบบตัวสร้าง (ส่วนใหญ่ใน Java) พวกเขาทั้งหมดมีคลาสเอนทิตี้ (สมมุติว่าPersonคลาส) และคลาสบิลPersonBuilderเดอร์ ผู้สร้าง "สแต็ค" ฟิลด์ที่หลากหลายและส่งกลับค่าnew Personด้วยอาร์กิวเมนต์ที่ส่งผ่าน ทำไมเราต้องมีคลาสผู้สร้างอย่างชัดเจนแทนที่จะใส่เมธอดผู้สร้างทั้งหมดลงในPersonคลาสเอง?
ตัวอย่างเช่น:
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;
}
}
ฉันสามารถพูดได้ Person john = new Person().withName("John");
ทำไมต้องPersonBuilderเรียน?
ประโยชน์อย่างเดียวที่ฉันเห็นคือเราสามารถประกาศPersonเขตข้อมูลได้อย่างfinalมั่นใจ
withNameคืนสำเนาของบุคคลโดยเปลี่ยนเฉพาะชื่อฟิลด์ ในคำอื่น ๆPerson john = new Person().withName("John");สามารถทำงานได้แม้ว่าPersonจะไม่เปลี่ยนรูป (และนี่คือรูปแบบทั่วไปในการเขียนโปรแกรมการทำงาน)
voidวิธีการ ดังนั้นสำหรับตัวอย่างเช่นถ้ามีวิธีที่พิมพ์ชื่อของพวกเขาคุณยังสามารถโยงกับอินเตอร์เฟซเหมือนเจ้าของภาษาPerson person.setName("Alice").sayName().setName("Bob").sayName()โดยวิธีการที่ฉันทำคำอธิบายประกอบเหล่านั้นใน JavaDoc กับข้อเสนอแนะของคุณ@return Fluent interface- มันเป็นเรื่องทั่วไปและชัดเจนพอเมื่อมันใช้กับวิธีการใด ๆ ที่ทำreturn thisในตอนท้ายของการดำเนินการและมันค่อนข้างชัดเจน ดังนั้นตัวสร้างจะทำส่วนต่อประสานที่คล่องแคล่ว
chainable setters: D