Derzeit will ich in einer Factory eine Strategie erstellen, womit sich dann etwas berechnen lässt aber ich komme nicht mehr so ganz mit den Generics klar. Derzeit läuft meine Lösung so zwar aber diese ist irgendwie unschön und ich würde das gerne komplett generisch haben. Ich habe das mal als Beispiel mit dem typischen Fruit Beispiel erstellt, weil das sonst zu viel wäre.
Das hier ist die Factory Method Schnittstelle:
Das hier ist die entsprechende Factory:
und das hier ist abstrake Strategieklasse:
und das hier eine konkrete Strategieklasse, als Beispiel:
Das Problem ist ja, dass ich in der Factory jeweils auf den richtigen Typ casten muss, da ich ja in der konkreten Strategie auf die Methoden oder die Felder zugreifen will. Der cast ist ja sicher, da ich über die getFruitType()-Methode vorher prüfe, welchen Typ die Fruit hat aber wie kann ich diesen cast loswerden? Der Typ der Fruit ist nämlich erst zur Lafuzeit bekannt. Ich könnte zwar auch in der jeweiligen Strategie auf die richtigen Fruit casten, also so:
aber wie kann ich das generischer lösen? Sonst muss man ja auch in der Factory jede konkrete Fruit kennen, um casten zu können oder halt in der Strategie selber immer auf die konkrete Fruit casten.
Das hier ist die Factory Method Schnittstelle:
Code:
public interface FruitCalcCreator<T extends Fruit> {
public FruitCalcStrategy<? extends Fruit> createFruitCalc(T fruit);
}
Code:
public class FruitCalcFactory implements FruitCalcCreator<Fruit> {
@Override
public FruitCalcStrategy<?> createFruitCalc(Fruit fruit) {
switch(fruit.getFruitType()) {
case APPLE:
return new AppleCalcStrategy((Apple) fruit);
case ORANGE:
return new OrangeCalcStrategy((Orange) fruit);
}
}
}
und das hier ist abstrake Strategieklasse:
Code:
public abstract class FruitCalccSrategy<T extends Fruit> {
protected T fruit;
public FruitCalcStrategy(T fruit) {
this.fruit = fruit;
}
public abstract double calcPrice(int quantity);
}
und das hier eine konkrete Strategieklasse, als Beispiel:
Code:
public class AppleCalcStrategy extends FruitCalcStrategy<Apple> {
public AppleCalcStrategy(Apple apple) {
super(apple);
}
@Override
public double calcPrice(int quantity) {
return apple.getPrice() * quantity;
}
}
Das Problem ist ja, dass ich in der Factory jeweils auf den richtigen Typ casten muss, da ich ja in der konkreten Strategie auf die Methoden oder die Felder zugreifen will. Der cast ist ja sicher, da ich über die getFruitType()-Methode vorher prüfe, welchen Typ die Fruit hat aber wie kann ich diesen cast loswerden? Der Typ der Fruit ist nämlich erst zur Lafuzeit bekannt. Ich könnte zwar auch in der jeweiligen Strategie auf die richtigen Fruit casten, also so:
Code:
public class AppleCalcStrategy extends FruitCalcStrategy<Apple> {
public AppleCalcStrategy(Fruit apple) {
super((Apple) fruit);
}
@Override
public double calcPrice(int quantity) {
// Hier würde ich auch noch auf weitere Felder der Fruit zugreifen wollen, was ja nur geht, wenn man den Typ auch hat.
return apple.getPrice() * quantity;
}
}
Zuletzt bearbeitet: