Singleton Pattern passend hierfür?

Status
Nicht offen für weitere Antworten.
S

SilentBob

Gast
Hallo,

Ich habe einen JFrame mit bisher 6 TabbedPanes drin, könnten auch bis zu 10 werden.

Nun haben diese 6 GUI Klassen zur Unterscheidung namen wie xxxView während die dazugehörigen Klassen mit den Methoden xxxControl heißen und evtl. gibts noch xxxModel Klassen die Daten aufnehmen.

Nun sind das ganze ca. 15 Klassen. Jede der Klasse greift mehr/weniger auf andere Klassen zu. Nun habe ich natürlich das WirrWarr, dass ich die erzeugten Objekte der GUI KLassen oder die Objekte der Control Klassen überall hindurchreichen muss, denn ein 2. Objekt der GUI Klasse geht nicht, da ich sonst einen NullPointer bekomme. Das ganze sieht dann natürlich nicht so elegant aus und viele KLasse haben 3 Parameter im Konstruktor.

Nun frage ich mich ob es nicht ideal wäre das Singleton Pattern hier anzuwenden:

1. damit objekte auch sicher nur einmal erzeugt werden und ich nicht immer darauf achten muss ja das Objekt richtig weiterzugeben etc

2. damit ich eine angebliche so las ich es GLOBALE Stelle habe wo ich das Objekt abholen kann. Wäre super geschickt, wenn ich nicht immer von hir nach da und dort das Objekt reiche...

3. und das Single-Objekt wird nur erstellt wenns benötigt wird, spart Ressourcen.

Ist das Singleton ok für diesen Anwendungsfall? was denkt Ihr? Hat mir vielleicht jemand gute Links mit Anwendungsfällen dieser Komplexität?
 
S

SilentBob

Gast
ms hat gesagt.:
Code:
public class MainWindow extends JFrame
{   
   public MainWindow() throws IOException
   {
      super("Test"); 

      XmlDaten xmlDaten = leseXmlDaten();
      
      InvoicePanel invoicePanel = new InvoicePanel();
      invoicePanel.setDaten(xmlDaten);

      SettingsPanel settingsPanel = new SettingsPanel();
      settingsPanel.setDaten(xmlDaten);

      jtp.addTab("Invoice", invoicePanel);   
      jtp.addTab("Settings", settingsPanel);
   
      add(jtp);
     
      ...     
   }

   private XmlDaten leseXmlDaten() {
   
      // ... hier werden die Daten gelesen und zurückgegeben

      return ...
   }

}

edit: InvoicePanel und SettingsPanel müssen natürlich mit den XmlDaten umgehen können.
Noch besser wäre es wenn man eine Referenz auf eine Modelklasse mitgibt, damit die Actions gleich darauf arbeiten können.

ms

müsste das nicht
Code:
invoicePanel.setDaten(leseXmlDaten())
heißen ? Das X ist einmal groß und einmal kleingeschrieben, daher verwirrend.

Naja eine leseXMLDAten Funktion in einer View sprich JFrame orientiert sich aber nicht sehr start an der Trennung von View und Model oder?

Noch besser wäre es wenn man eine Referenz auf eine Modelklasse mitgibt, damit die Actions gleich darauf arbeiten können.

meinst du mit Referenz die Instanz meiner SettingsData Klasse wo alle xml Daten drin sind? yo diese Referenz wäre dann in der leseXmlDaten() methode.
 

ms

Top Contributor
Alle X sind richtig.

Eine Methode hält in dem Sinn keine Referenzen so wie es Objekte tun.
Ich verstehe deine Frage nicht ganz.

invoicePanel.setDaten(leseXmlDaten())
Du willst die Daten doch auch im SettingsPanel haben, oder?
Also einmal Lesen und die Referenz den beiden Panels die Referenz übergeben.

ms
 
S

SilentBob

Gast
oh man meine Augen...

Ich dachte:
Code:
XmlDaten xmlDaten = leseXmlDaten();

das heißt
Code:
XmlDaten xmlDaten = new XmlDaten();

jetzt verstehe ich erst den Zusammenhang bzw. warum das eine X groß/klein ist hehe

1.) Ich nehme an, dass deine Methode leseXmlDaten() meiner methode loadXMLData() entspricht, wenn ja dann habe ich zwar eine Referenz in dem objekt xmlDaten und übergebe das objekt dem InvoicePanel/SettingsPanel doch dann bräuchte ich ja noch getxx Methoden in beiden Panel-Klassen die das objekt auslesen und die daten in die JCBoxen schreiben richtig?

2.) Was mich wundert ist, dass du die leseXmlDaten() methode in die View schreibst? OK es gibt 1000 verschiedene anwendugsarten und spezielle Problemfälle ich bin auch der Meinung, dass man MVC etc nicht in jedes Schema pressen kann ;-)
 
S

SilentBob

Gast
So das einlesen in beide JComboboxen geht erstmal, ob es so ist wie dus gerne hättest bin mir net 100% sicher...


Code:
public class MainWindow extends JFrame
{    
   static final long serialVersionUID = 1L;   
   private JTabbedPane jtp = new JTabbedPane();   
   private SettingsData settingsdata = new SettingsData();
   public MainWindow() throws IOException
   {
	  super("Test");  
   
	  SettingsData settingsData = loadXMLData(); 
	  
	  InvoicePanel invoicePanel = new InvoicePanel(); 
	  invoicePanel.setDaten(settingsData); 	  
	  
	  SettingsPanel settingsPanel = new SettingsPanel();
	  settingsPanel.setDaten(settingsData); 
	  
      jtp.addTab("Invoice", invoicePanel);  
      jtp.addTab("Settings", settingsPanel); 
    
      add(jtp); 
      
      setResizable(false);      
      setSize(400,400);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
      setVisible(true);	
      
   }
   
   public SettingsData loadXMLData()
	{ 		
		try
		{ 
           JAXBContext jc = JAXBContext.newInstance(SettingsData.class);
           Unmarshaller um = jc.createUnmarshaller ();           
	       Object o = um.unmarshal(new FileInputStream("test.xml"));
	       settingsdata = (SettingsData) o; 	       
	         
      }
	   catch (Exception e)
	   {
       e.printStackTrace (); 
      }
	   
	   return settingsdata;
	   
	}
       
   public static void main(String []args) throws Exception
   {  
	      
	      EventQueue.invokeLater(new Runnable()
	      {
		      public void run()
		      {	      
				try 
				{ 				
					new MainWindow(); 
				}
				catch (IOException e)
				{				
					e.printStackTrace();
				}	                    
		      }
	      });  	      
   }
}


Code:
public class InvoicePanel extends JPanel
{	 	
	private static final long serialVersionUID = 1L;
    JComboBox jcb = new JComboBox();

	public InvoicePanel()
    {   
		setLayout(null);
		add(jcb);		
		jcb.setBounds(0,0,200,30);
    }
	
	public void setDaten(SettingsData settingsData)
	{
		for(int i = 0 ; i < settingsData.getListCurrencyFormat().size() ; i++)
        {
        	jcb.addItem(settingsData.getListCurrencyFormat().get(i));	        	
        }		
	}	   
}


Code:
public class SettingsPanel extends JPanel
{	 	
	private static final long serialVersionUID = 1L;
	JComboBox jcb = new JComboBox();

	public SettingsPanel()
    {  		
		setLayout(null);
		add(jcb);		
		jcb.setBounds(0,0,200,30);
    }
	
	public void setDaten(SettingsData settingsData)
	{
		for(int i = 0 ; i < settingsData.getListCurrencyFormat().size() ; i++)
        {
        	jcb.addItem(settingsData.getListCurrencyFormat().get(i));	        	
        }		
	}	    
}


Was ich nicht ganz verstehe ist , warum kann ichs net so machen:

Code:
// fällt weg, da methodenaufruf in methode eh settingsData zurückgibt...
//SettingsData settingsData = loadXMLData(); 
	  
InvoicePanel invoicePanel = new InvoicePanel(); 
invoicePanel.setDaten(loadXMLData()); 	  
	  
SettingsPanel settingsPanel = new SettingsPanel();
settingsPanel.setDaten(loadXMLData());
 
S

SilentBob

Gast
Damit hast du insofern eine lose Kopplung, als dass du dieses Panel auch in einem komplett anderen Programm verwenden könntest, eine eigenständige Komponente sozusagen.
Derjenige, der diese Komponenten zu einem Programm zusammenfügt muss natürlich dafür sorgen, dass die Daten gesetzt werden.

Ok solangsam kapier ichs... obiges heißt also weil ich die setDaten(...) Methode benutze ist die Panel GUI unabhängig, denn man kann muss aber net diese Methode aufrufen, daher kann ich den panel auch in einem anderen Programm nutzen sozusgen, da keine direkte Abhängigkeit zu den xml Daten besteht. Ok würde ich den Panel als eigentständige Komponente nutzen und rufe die setDaten nicht auf sprich sie wird nicht benötigt in dem anderen Programm sollte ich sie ja löschen da Speicherverschwendung auch wenn sie net aufgerufen wird oder?
 
S

SilentBob

Gast
was ich mich jetzt auch noch frage ist:

Ich habe mehrere Klassen die Informationen aus der xml datei benötigen. Diese Informationen sind in dem settingsData Objekt drin und werden in die GUI sprich SettingsPanel geschrieben. Soll ich nun die Infos direkt aus dem Objekt settingsData lesen oder auf die GUI zugreifen und hier auslesen, wie handhabt man das am Besten allgemein?
 

diggaa1984

Top Contributor
rein prinzipiell neige ich dazu die daten ausschließlich aus der datenquelle zu beziehen, die GUI holt sie sich und zeigt nur an, und is mit ausnahme der nutzereingaben nicht für datenbereitstellung konzipiert, also in meinen programmen
 

ms

Top Contributor
SilentBob hat gesagt.:
Ok würde ich den Panel als eigentständige Komponente nutzen und rufe die setDaten nicht auf sprich sie wird nicht benötigt in dem anderen Programm sollte ich sie ja löschen da Speicherverschwendung auch wenn sie net aufgerufen wird oder?
Du willst die Methode setDaten(...) in einem anderen Programm löschen weil du sie dort nicht brauchst?
Wenn du prinzipiell so vor gehst dann müsstest du ja auch alle nicht benötigten Methoden aus der Java-Api löschen. :autsch:
Oder meinst du was anderes?

SilentBob hat gesagt.:
Ich habe mehrere Klassen die Informationen aus der xml datei benötigen. Diese Informationen sind in dem settingsData Objekt drin und werden in die GUI sprich SettingsPanel geschrieben. Soll ich nun die Infos direkt aus dem Objekt settingsData lesen oder auf die GUI zugreifen und hier auslesen, wie handhabt man das am Besten allgemein?
Mit dem MVC-Pattern.

ms
 
V

voidee

Gast
Ich nehme mal Bezug auf das Ursprungsposting, ohne die restlichen Antworten alle durchzuarbeiten:

grundsätzlich denke ich, dass eine Trennung von View und Mode und Controller eine sehr sinnvolle Sache ist (MVC hat was). Das Problem ist, dass man das schön durchhält, wenn man ein oder zwei GUI's hat. Bei 6 bis 10 wächst das ganz ordentlich an. Das werden sehr viele Klassen. Aber was macht das? Das ist vielleicht für den Entwickler oder für einen selbst, wenn man 6 Monate später reinschaut zunächst ein bisschen viel, aber im Endeffekt bleiben es 3 grob 3 Klassen je GUI.

Stellt sich die Frage der Übersichtlichkeit.

Bleibt der Quellcode übersichtlicher wenn man ein "Singleton" verwendet? Ich denke wenn man sich mit dem Grundgedanken, was das Singleton-Pattern soll, auseinandersetzt, wird man herausfinden, dass Singleton nicht die Lösung ist.
Ein Singleton System soll sicherstellen, dass in einer Java-Virtual-Machine nur eine Instanz des Objekts existiert. Als Anwender möchte ich aber bei einer GUI ruhig mal ein zweites oder drittes Fenster öffnen. das Singleton würde mir das verbieten.

Deshalb würde ich empfehlen, dass man eine "Main" Klasse entwickelt, die alle Sub-GUIS (JPanels?) instanziiert. Im Konstruktur wird bei meinen Lösungen im Regelfall die Mainklasse mitgegeben. Kommunkation erfolgt über das Listener-Konzept. Dadurch werden aber noch ein paar zusätzliche Klassen notwendig, aber man sollte bedenken, dass Progrmmierung nicht nur aus Quellcode besteht. Javadoc - und das ist echt eine tolle Sache - gehört meines Erachtens auch dazu.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A ist das ein Singleton-Pattern? Java Basics - Anfänger-Themen 6
D Objekte anlegen und Singleton Pattern Java Basics - Anfänger-Themen 21
M Singleton Pattern Java Basics - Anfänger-Themen 35
J Singleton Pattern Java Basics - Anfänger-Themen 5
G Singleton Pattern Java Basics - Anfänger-Themen 7
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
W Sinn eines Singleton ? Java Basics - Anfänger-Themen 14
O Singleton Java Basics - Anfänger-Themen 5
R Methode in Singleton Klasse Java Basics - Anfänger-Themen 1
O Singleton Verständnis Java Basics - Anfänger-Themen 4
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Singleton (Design Patterns) Java Basics - Anfänger-Themen 16
R OOP Singleton Java Basics - Anfänger-Themen 10
U Vererben von Singleton Java Basics - Anfänger-Themen 17
S Singleton - Daten einspielen Java Basics - Anfänger-Themen 5
K Warum ist ein Singleton kein Best Practise? Java Basics - Anfänger-Themen 3
M Singleton mit Parametern im Konstruktor Java Basics - Anfänger-Themen 18
D Singleton beim JFrame zerstören Java Basics - Anfänger-Themen 4
L Java Serialisierung Singleton Java Basics - Anfänger-Themen 6
A JBoss-Anwendung soll im Singleton-Mode laufen Java Basics - Anfänger-Themen 6
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
S Instanz(en) einer Singleton-Klasse Java Basics - Anfänger-Themen 11
S Statische Klassen/ Singleton Java Basics - Anfänger-Themen 13
J Warum verwendet man Singleton? Java Basics - Anfänger-Themen 7
B Was ist der unterschied zwischen Singleton und Strategy? Java Basics - Anfänger-Themen 6
S Singleton lazy Java Basics - Anfänger-Themen 8
P Singleton-Implementation Java Basics - Anfänger-Themen 8
F singleton Java Basics - Anfänger-Themen 4
T Singleton Java Basics - Anfänger-Themen 13
Antoras Singleton oder Controller / Datenverwaltungsklasse? Java Basics - Anfänger-Themen 10
D Denkfehler Singleton Java Basics - Anfänger-Themen 53
X Singleton - In diesem Fall sinnvoll? Java Basics - Anfänger-Themen 22
S Fragen zu synchronized + Singleton! Java Basics - Anfänger-Themen 10
M Mp3 Player mit Singleton Java Basics - Anfänger-Themen 8
M GUI als SingleTon Java Basics - Anfänger-Themen 6
B Singleton und Resourcebundle Java Basics - Anfänger-Themen 7
D Singleton in Java implementieren Java Basics - Anfänger-Themen 6
H singleton Synchronisations Problem? Java Basics - Anfänger-Themen 2
M Singleton verwenden, aber wie? Java Basics - Anfänger-Themen 3
H Singleton mit Attributen Java Basics - Anfänger-Themen 7
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
W GoF-Pattern im Programmierer-Alltag Java Basics - Anfänger-Themen 113
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
Dimax Erste Schritte Pattern.matcher,die Besonderheiten. Java Basics - Anfänger-Themen 12
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
F Design pattern Java Basics - Anfänger-Themen 29
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
D Design Pattern Command Java Basics - Anfänger-Themen 3
Bregedur Methoden Matcher und Pattern bei sich wiederholenden Werten Java Basics - Anfänger-Themen 1
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
S Regex Pattern Java Basics - Anfänger-Themen 3
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
M Methoden Pattern Matching Vokal Java Basics - Anfänger-Themen 2
agent47 Pattern split Java Basics - Anfänger-Themen 2
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
I Vertändnisfrage zu Prototype Pattern Java Basics - Anfänger-Themen 0
L Kompositum-Pattern Hilfe :O Java Basics - Anfänger-Themen 4
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Pattern Matching ohne Match-Methoden Java Basics - Anfänger-Themen 11
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
M MVC + Strategy Pattern Ansatz (mit Code) Java Basics - Anfänger-Themen 5
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
P Grundsatzfrage zu Decorator-Pattern Java Basics - Anfänger-Themen 6
L Pattern Matching Java Basics - Anfänger-Themen 3
L RegExp bzw Pattern in Java Java Basics - Anfänger-Themen 6
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
R aktualisierung des View im MVC-Pattern Java Basics - Anfänger-Themen 5
M RegEx Pattern Matcher Java Basics - Anfänger-Themen 16
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
N Regexp Pattern & Matcher Problem Java Basics - Anfänger-Themen 4
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
R Welches Design pattern Java Basics - Anfänger-Themen 10
B static und Pattern matching Java Basics - Anfänger-Themen 22
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
T Decorator Pattern Java Basics - Anfänger-Themen 7
A Pattern und Matcher Java Basics - Anfänger-Themen 9
T Frage zu Pattern/Matcher Java Basics - Anfänger-Themen 6
D Pattern in Midi-Sequencer Java Basics - Anfänger-Themen 2
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
M Regex-Pattern Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen


Oben