ให้บทความ Dr Dobbs นี้และรูปแบบตัวสร้างโดยเฉพาะเราจะจัดการกรณีของคลาสย่อยของ Builder ได้อย่างไร? การใช้ตัวอย่างแบบย่อส่วนที่เราต้องการให้คลาสย่อยเพิ่มการติดฉลากจีเอ็มโอการใช้งานที่ไร้เดียงสาจะเป็น:
public class NutritionFacts {
private final int calories;
public static class Builder {
private int calories = 0;
public Builder() {}
public Builder calories(int val) { calories = val; return this; }
public NutritionFacts build() { return new NutritionFacts(this); }
}
protected NutritionFacts(Builder builder) {
calories = builder.calories;
}
}
ซับคลาส:
public class GMOFacts extends NutritionFacts {
private final boolean hasGMO;
public static class Builder extends NutritionFacts.Builder {
private boolean hasGMO = false;
public Builder() {}
public Builder GMO(boolean val) { hasGMO = val; return this; }
public GMOFacts build() { return new GMOFacts(this); }
}
protected GMOFacts(Builder builder) {
super(builder);
hasGMO = builder.hasGMO;
}
}
ตอนนี้เราสามารถเขียนโค้ดได้ดังนี้:
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
แต่ถ้าเราสั่งผิดทุกอย่างจะล้มเหลว:
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);
ปัญหาคือแน่นอนว่าNutritionFacts.Builder
ส่งคืน a NutritionFacts.Builder
ไม่ใช่ a GMOFacts.Builder
แล้วเราจะแก้ปัญหานี้อย่างไรหรือมีรูปแบบที่ดีกว่าให้ใช้?
หมายเหตุ: คำตอบสำหรับคำถามที่คล้ายกันนี้นำเสนอชั้นเรียนที่ฉันมีด้านบน คำถามของฉันเกี่ยวกับปัญหาในการตรวจสอบว่าการโทรของผู้สร้างอยู่ในลำดับที่ถูกต้อง
build()
เอาท์พุทb.GMO(true).calories(100)
อย่างไร?