Abstrakte Fabrik für unterschiedliche Signaturen?

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,


ich möchte gerne Wissen aus einer Klasse in eine Fabrikmethode auslagern.

Im Konstruktor einer Klasse A erzeuge ich momentan in einem if..else if.. else Statement je nach übergebenen Wert unterschiedliche konkrete Typen eines AbstractTyp.

Problem ist: alle unterschiedlichen, von AbstractTyp abgeleitete Typen haben eine andere Signatur mit unterschiedlich vielen Parametern zur Erzeugung.

Was gibt es da für eine Möglichkei, den Vorgang schöner zu kapseln? Eine Fabrikmethode scheint mir geeignet, nur leider haben die, wenn ich es richtig verstanden habe, alle die gleiche Signatur.

Danke für eure Hinweise!

Gruß
 
Fabrikmethoden können die Signatur haben die du möchtest, eine Möglichkeit wäre, für jedes Produkt eine Methode, eine andere wäre, als Paramter die Klasse/Interface zu übergeben und dann per Reflection und Konfiguration/Konvetion eine Instanz zu erzeugen.
 
Hallo,

ich verstehe nicht ganz:

Fabrikmethode.png



Ich müsste alle möglichen Signaturen im Erzeuger implementieren, der dann die entsprechenden KonkreterErzeuger für jeden möglichen Typen ruft?! Das scheint mir nicht praktikabel zu sein, da die unterschiedlichen Produkte ja bis auf die verschiedenen Konstruktoren identisch sind und ich damit noch mehr Klassen hätte..

Bild ist aus wikipedia.

Gruß
 
Wenn die konkreten Produkte nicht über eine gemeinsame Schnittstelle (interface) verfügen, ist das Muster eh für die Katz.

Jetzt mal Butter bei die Fische: Wie sehen den die konkreten Produkte aus?
 
Code:
class Hauptklasse {

abstractElement ele;

public Hauptklasse(int length, int value) {

if(length > 5) ele = new ConcreteElement1(value);

else
 ele = new ConcreteElement2(length, value);


}

}

abstract AbstractElement {
public int update();
}

class ConcreteElement1 extends AbstractElement {

public ConcreteElement1(int value) {
// zuweisen
}

}

class ConcreteElement2 extends AbstractElement {

public ConcreteElement2(int length, value) {

// zuweisen
}

}

voila, so als Minimalbeispiel. Diese if/ else im Konstruktor von Hauptklasse würde ich gerne auslagern. Wie mach ich das am geschicktesten?

Danke maki für deine Antworten!!

Gruß
 
Solltest keine public Konstruktoren anbieten, die instanziierung übernimmt die Factory, sonst ist das Factory Muster (egal ob Abstract oder FactoryMethod) ziemlich sinnbefreit 😉

Mache eine Methode in der Factory (Hauptklasse):
Code:
public static AbstractElement getProduct(int length, int value) {
  if(length > 5) {
    element = new ConcreteElement1(value);
  } else {
    element = new ConcreteElement2(length, value); 
  }

  return element;
}
Abgesehen davon wäre es besser, nicht eine Abstrakte Klasse als Rückgabewert zu haben, sondern ein Interface, dann wissen die Klienten gar nix über die Implementierung 😉
 
Hast recht, werd auf Interface umstellen.

Der Code von dir ist eigentlich eine Fabrikmethode oder? Kann KonkreterErzeuger nicht entdecken, also nehme ich das mal an.

Werd das so machen, danke dir für deine Hilfe!

Gruß
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben