Cung cấp bài viết này cho Tiến sĩ Dobbs và Mô hình Trình tạo cụ thể, làm thế nào để chúng tôi xử lý trường hợp phân lớp Trình tạo? Lấy một phiên bản rút gọn của ví dụ mà chúng tôi muốn phân lớp để thêm nhãn GMO, một triển khai ngây thơ sẽ là:
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;
}
}
Phân lớp:
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;
}
}
Bây giờ, chúng ta có thể viết mã như thế này:
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
Nhưng, nếu chúng tôi nhận được lệnh sai, tất cả đều thất bại:
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);
Vấn đề tất nhiên là NutritionFacts.Builder
trả về a NutritionFacts.Builder
, không phải a GMOFacts.Builder
, vậy làm thế nào để chúng ta giải quyết vấn đề này, hoặc có một Mô hình tốt hơn để sử dụng?
Lưu ý: câu trả lời này cho một câu hỏi tương tự cung cấp các lớp tôi có ở trên; câu hỏi của tôi liên quan đến vấn đề đảm bảo các cuộc gọi của người xây dựng theo đúng thứ tự.
build()
đầu ra của b.GMO(true).calories(100)
?