Ver ben Doktor Dobbs makaleye biz Builder sınıflara eden olayda nasıl ve özellikle Oluşturucu Desen? GDO etiketleme eklemek için alt sınıfa eklemek istediğimiz örneğin kısaltılmış bir versiyonunu ele alırsak, saf bir uygulama şöyle olacaktır:
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;
}
}
Alt sınıf:
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;
}
}
Şimdi, şu şekilde kod yazabiliriz:
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
Ancak siparişi yanlış yaparsak, hepsi başarısız olur:
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);
Sorun elbette NutritionFacts.Buildera NutritionFacts.Builderdeğil a döndürmesidir , GMOFacts.Builderpeki bu problemi nasıl çözeceğiz yoksa kullanılacak daha iyi bir Kalıp var mı?
Not: Benzer bir soruya verdiğim bu cevap , yukarıdaki derslerimi sunuyor; Sorum, inşaatçı çağrılarının doğru sırada olmasını sağlama sorunuyla ilgilidir.
build()çıktısını nasıl elde edersiniz b.GMO(true).calories(100)?