Moin... hab gerade nen kleines Designproblem und komm nicht so richtig hinter die "richtige" Lösung, bzw. weiß nicht, ob mein geplantes Vorgehen jetzt besonders hübsch ist oder nicht 
Folgende Sache: Ich habe eine Factoryklasse die verschiedene Produkte (16) eines Obertyps erzeugen soll. Dazu ists aber erforderlich, dass der Benutzer einige Daten eingibt, die zu erzeugenden Objekte also zunächst konfiguriert. Die Auswahl derjenigen Einstellungen die der Nutzer machen kann ist wiederum abhängig vom Typ zweier Objekte.
Jetzt hab ich in der Factory eine Methode erstellt, die anhand dieser zwei Objekte schonmal ein JPanel erstellt (Fallunterscheidung mitHilfe von instanceof über die beiden Objekte)... dieses Panel wird dann später in einem Wizard dargestellt und unterscheidet sich halt jedes Mal etwas...
soweit so gut
- jetzt hab ich das Problem, dass ich zu diesem Zeitpunkt anhand der beiden übergebenen Objekte schon weiß, welcher Typ das später werden muss, den ich mit der Factory erzeugen will. Momentane Idee ist, dass ich an der Stelle schonmal den Typ erzeuge und in einem Feld "currentProduct" zwischenspeichere (in der factory) - wenn ich später im Panel alle Angaben gemacht hab und auf "DONE" drücke, kann ich mit den Daten des Panels das Produkt konkretisieren und in der eigentlichen create-Methode zurückgeben.
Jetzt ists aber so, dass die Datenfelder in den Panels natürlich recht unterschiedlich sind - die Idee war jetzt, dass ich ne JavaBean baue, die ich der eigentlichen createMethode der Factory übergebe, diese das temporär gespeicherte Produkt schnappt, einer im Produkt vorhandenen setConfig-Methode die Bean übergebe und letztlich das Endprodukt zurückgebe...
Der Umweg über die Bean deswegen, weil ich ansonsten wieder unterschiedliche create-Methoden für den jeweiligen Typ hätte und diese auch irgendwo abhängig vom Typ des Endprodukts aufrufen müsste... allerdings geb ich zu, dass dann die Konfiguration des Produkts im Produkt selbst nach seiner eigentlichen Erzeugung stattfindet... nicht ganz im Sinne des Erfinders der Factory oder?
Andererseits kann dann das Produkt selbst entscheiden in seiner jeweiligen Variante der setConfig-Methode, welche Daten sie aus der Bean auslesen möchte.
Ne andere Möglichkeit wäre sich den Endtyp irgendwie als Konstante zu speichern - allerdings muss dann am Ende schon wieder ne Fallunterscheidung anhand 16 unterschiedlicher Konstanten stattfinden, was auch wieder blöd wäre...
Zudem wäre es durchaus möglich, dass irgendwann noch weitere Produkte hinzukommen - d.h. man müsste immer auch noch die Konstantensammlung erweitern etc...
Auch könnte ich natürlich die Fallunterscheidung die zur jeweiligen Auswahl und Erzeugung des Panels geführt hat, einfach später für die Erzeugung des Endprodukts nochmal wiederholen... aber 16 instanceofs in einer Methode per if-else sieht schon einmal sehr bescheuert aus
..
Irgendwie gefällt mir das alles nicht so
- hat nicht evtl. jemand nen Tip für mich, falls man überhaupt durch das sehr abstrakte Gelaber von oben durchsteigt?
P.S. 2nd-Question - was würdet ihr davon halten, wenn eine Factory-Methode nicht nur das Produkt selbst erstellt, sondern auch gleich schon in die relevanten Datenstrukturen einträgt, die es am Ende verwalten sollen. Sauber oder eher Unsauber?
Folgende Sache: Ich habe eine Factoryklasse die verschiedene Produkte (16) eines Obertyps erzeugen soll. Dazu ists aber erforderlich, dass der Benutzer einige Daten eingibt, die zu erzeugenden Objekte also zunächst konfiguriert. Die Auswahl derjenigen Einstellungen die der Nutzer machen kann ist wiederum abhängig vom Typ zweier Objekte.
Jetzt hab ich in der Factory eine Methode erstellt, die anhand dieser zwei Objekte schonmal ein JPanel erstellt (Fallunterscheidung mitHilfe von instanceof über die beiden Objekte)... dieses Panel wird dann später in einem Wizard dargestellt und unterscheidet sich halt jedes Mal etwas...
soweit so gut
Jetzt ists aber so, dass die Datenfelder in den Panels natürlich recht unterschiedlich sind - die Idee war jetzt, dass ich ne JavaBean baue, die ich der eigentlichen createMethode der Factory übergebe, diese das temporär gespeicherte Produkt schnappt, einer im Produkt vorhandenen setConfig-Methode die Bean übergebe und letztlich das Endprodukt zurückgebe...
Der Umweg über die Bean deswegen, weil ich ansonsten wieder unterschiedliche create-Methoden für den jeweiligen Typ hätte und diese auch irgendwo abhängig vom Typ des Endprodukts aufrufen müsste... allerdings geb ich zu, dass dann die Konfiguration des Produkts im Produkt selbst nach seiner eigentlichen Erzeugung stattfindet... nicht ganz im Sinne des Erfinders der Factory oder?
Andererseits kann dann das Produkt selbst entscheiden in seiner jeweiligen Variante der setConfig-Methode, welche Daten sie aus der Bean auslesen möchte.
Ne andere Möglichkeit wäre sich den Endtyp irgendwie als Konstante zu speichern - allerdings muss dann am Ende schon wieder ne Fallunterscheidung anhand 16 unterschiedlicher Konstanten stattfinden, was auch wieder blöd wäre...
Zudem wäre es durchaus möglich, dass irgendwann noch weitere Produkte hinzukommen - d.h. man müsste immer auch noch die Konstantensammlung erweitern etc...
Auch könnte ich natürlich die Fallunterscheidung die zur jeweiligen Auswahl und Erzeugung des Panels geführt hat, einfach später für die Erzeugung des Endprodukts nochmal wiederholen... aber 16 instanceofs in einer Methode per if-else sieht schon einmal sehr bescheuert aus
Irgendwie gefällt mir das alles nicht so
P.S. 2nd-Question - was würdet ihr davon halten, wenn eine Factory-Methode nicht nur das Produkt selbst erstellt, sondern auch gleich schon in die relevanten Datenstrukturen einträgt, die es am Ende verwalten sollen. Sauber oder eher Unsauber?