Welches Design pattern

richi_

Mitglied
Hallo @ all,

ich wollte wissen ob es ein Design pattern für folgendes Szenario gibt.

Ich habe mehrere Klassen die ein bestimmtes Objekt immer wieder benötigen. Diese Objekt erzeuge ich in der main-methode und übergebe die Instanz einem anderen Klasse. Diese verwendet es und übergibt es weiter. Und so geht es immer weiter.


Also ich finde diese (meine) Lösung einfach nicht schön. Soll ich eine statische Klasse mit einer Membervariable dieses Objektes besitzt.

Ich hoffe diese Beschreibung ist nicht zu konfus.

Folgendes Beispiel fällt mir auf die schnelle ein. Ich lege einen XMLWriter in der Main-Methode an. Übergebe diesen Writer an eine Klasse A. Diese Klasse A schreibt etwas in ein XML File und ruft dann eine Methode der Klasse B auf und übergibt dieser Methode wieder den XMLWriter usw.

Danke schon mal im voraus
mfg richi
 
Hallo.
Beim Singleton-Pattern greifst du immer auf ein Objekt zurück (ich kenne es bis jetzt nur bezüglich der Connection zu einer Datenbank).
Les' dich halt mal kurz ein, dann wirst du schon sehen ob es was für dich ist.

LG
 
Hallo Blindxantos,

danke für deine schnelle Antwort.

Ich habe mir das Singleton-Pattern gerade angeschaut. Ich möchte kurz sichergehen, dass ich es verstanden habe.
Also jede Klasse die dieses Objekt benötigt, legt sich ein neues Objekt an und durch das Singleton-Pattern wird gewährleistet, dass es das gleiche ist. Und dieser Stil ist sozusagen "schöner" als wenn man das Objekt hin und her schupft.

mfg richi
 
das singlepattern ist ja einigermaßen verrufen 🙂

aber mit dem "neu anlegen" hast du dich wohl nur ungeschickt ausgedrückt 🙂 .. es wird ja genau einmal erzeugt und alle anderen klassen holen sich diese Instanz von der Klasse des Singleton. Dabei muss sichergestellt werden, dass zB. bei Multi-Threaded-Umgebungen auch nur exakt ein Objekt erstellt wird .. je nach Code kann man da auch was falsches erzeugen und glaube es gäbe nur 1 Objekt 🙂
 
Also für das XMLWriter Beispiel passt das Singleton-Pattern sicher nicht. Wenn du Code refactored haben willst, und du weisst nicht, was du machen sollst, solltest du lieber den Code posten.

Speziell für XML gibt es ja auch zahlreiche Bibliotheken
 
Hallo ihr beiden und danke für eure Hilfe.

Ich mache kein refactoring sondern versuche mein erstes großes Projekt zu realisieren. Aber du hast recht, ist wahrscheinlich so einfacher. Wahrscheinlich hätte ich es gleich machen sollen. Tut mir leid.
Also ich werde Auszüge meines Codes mal posten.

Also es geht darum das ich Daten von eigentlich zwei XML-Files in ein Excel-File packen soll. Später sollen daraus mal Diagramme erzeugt werden.

Also in der Mainklasse lege ich mal mein Excel-File an:
Java:
workbook = Workbook.createWorkbook(file, wbSettings);

Im Anschluss dann übergebe ich mein Workbook meiner Klasse FetchXML();
Java:
FetchXML x = new FetchXML("location");
x.read(workbook);

FetchXML.read() wiederum liest dann Zeile für Zeile ein. Wenn es auf ein START_ELEMENT trifft
Java:
if(event.getEventType() == XMLStreamConstants.START_ELEMENT)

folgt eine case wo ich abfrage, bist du eine Person, Gruppe, usw. und je nachdem ob es eine Person, Gruppe usw. ist wird ein bestimmtes Objekt erzeugt.

Wenn es sich um eine Person handelt
Java:
Person p = new Person();
p.read(workbook);

Person, Gruppe usw. führen bestimmte Formatierungen durch und schreiben dann in das Excel-File. In späterer Folge soll ein Eintrag im XML File noch mit einer Datenbank abgeglichen werden und dann soll erst das Schreiben in die Excel-Tabelle erfolgen.


Mein Problem ist ich übergebe halt alle meinen Klassen das workbook. (leider sind es noch mehr Klassen 😳) Jede Klasse macht was spez. mit dem workbook aber mir gefällt das herumschupfen nicht und ich vermute mal ich denke zu prozedural.

Ich hoffe ich habe es halbwegs verständlich rübergebracht.

mfg richi
 
Ich weiss nicht, ob das zu fortgeschritten ist, aber du kannst das auslesen von XML und die Programmlogik mithilfe von einem XML-Binding, wie XStream oder JAXB trennen. Wenn man sich da erstmal reingefuchst hat ist es sehr viel einfacher, als die Daten per Hand mittels SAX oder DOM auszulesen. Für Anfänger ist es aber vielleicht zuviel.
 
Hallo Naaram,

danke für deine Antwort. Ich hab bis jetzt noch keine Erfahrung damit, aber man lernt ja nur etwas, wenn man es ausprobiert.

Ich habe auf jeden Fall jetzt den Singleton-Pattern Ansatz umgesetzt, damit ich das Workbook nicht immer mitgebe.

Ich werde mir in den nächsten Tagen XStream oder JAXB anschauen und versuchen eines der beiden zu verwenden.

Also ich bin sicher in den nächsten Tagen werde ich wieder einen neuen Beitrag erstellen 😉

Diesen werde ich nun schließen.

Danke an alle

mfg richi
 
Singletons haben aber einige Probleme und sollten nur eingesetzt werden, wenn man sicher gehen will, dass etwas nur xakt einmal vorhanden ist, und nicht um aus Bequemlichkeit "globale Variablen" zu nutzen.

Das läuft dem OOP dann nämlich wieder entgegen.
 
Ich habe mehrere Klassen die ein bestimmtes Objekt immer wieder benötigen. Diese Objekt erzeuge ich in der main-methode und übergebe die Instanz einem anderen Klasse. Diese verwendet es und übergibt es weiter. Und so geht es immer weiter.
Das nennt man "Depedency Injection", aber eben ohne Framework.

Und dieser Stil ist sozusagen "schöner" als wenn man das Objekt hin und her schupft.
Nö, ist er nicht.

Wenn du kein sauberes Design hast und überall ein und dasselbe Objekt referenzierst, dann macht es ein Singleton nicht besser, sondern schlechter, weil es dir nicht mehr auffällt wie häufig du ein Objekt referenzierst.

Was du beschreibst hört sich sehr nach globaler Variable an, keine gute Sache in OOAD.

Wieso haben soviele Klassen refrenzen zu diesem einen Objekt?
 
Hallo.

Ich habe mich erst heute wieder eingeloggt. Sorry hab es diesen Post nicht mehr weiterverfolgt.

Es haben unterschiedliche Klassen eine Referenz auf das Objekt, weil es überall benötigt wird. Ich habe in einer Klasse eine Abfrage an eine Datenbank es kommen neue Informationen hinzu die in diesem Projekt eingetragen werden. Ich werte XML-Files aus und es kommen wieder neue Informationen durch.

Wahrscheinlich ist es ein Konzeptfehler von mir.

Entschuldigt nochmal die späte Antwort ich hab die letzten Tage/Wochen nicht mehr nachgeschaut.

Danke für eure Antwort

richi
 

Zurück
Oben