OOP Warum gleiche Instanz der Klasse? (Factory-Muster)

stockhausen

Mitglied
Hallo Zusammen,

ich habe eine Factory-Klasse erstellt, der mir die Instanz einer Klasse zurück gibt.
In der main() Methode rufe ich die Factory-Klasse auf zwei verschiedene Weisen auf.

Frage

Warum wird in der nicht auskommentierte Variante immer die gleiche Instanz der Klasse MyFactory zurück gegeben?

Aufgrund der Tatsache, dass die Objekte der Factory-Klasse innerhalb der for-Schleife erstellt werden und die Objekte der MyClass innerhalb der Factory sollte eigentlich pro Schleifendurchlauf ein neues Objkt der Klasse MyClass erzeugt werden!

In der Auskommentierten Version rechne ich auf Grud der Tatsache, dass das Objekt der MyFactory-Klasse außerhalb der for-Schleife erzeugt wird mit dem gleichen Objekt der MyClass Klasse!

Ich hoffe, dass mein Anlieger halbwegs verständlich war!

Gruß,
Michael


Klasse MyFactory

Java:
public class MyFactory {

	private static MyClass INSTANCE = new MyClass();
	
	public MyClass getInstance() {
		return INSTANCE;
	}

}


Klasse MyClass

Java:
public class MyClass {

	public MyClass() {
		
	}
}


Klasse Start

Java:
public class Start {
	
	public static void main(String[] args) {
		for(int i=0; i<2; i++) {
			MyFactory factory = new MyFactory();
			MyClass myClass = factory.getInstance();
			System.out.println(myClass);
		}
		
//		MyFactory factory = new MyFactory();
//		for(int i=0; i<2; i++) {
//			MyClass myClass = factory.getInstance();
//			System.out.println(myClass);
//		}
		
	}
	
}

Java:
Ausgabe
-------

de.test.MyClass@addbf1
de.test.MyClass@addbf1
 
M

maki

Gast
Java:
public class MyFactory {
 
    private static MyClass INSTANCE = new MyClass();
    
    public MyClass getInstance() {
        return INSTANCE;
    }
 
}
Das ist ein Singleton und erstmal keine Factory ;)
 

HoaX

Top Contributor
Maki sagte es ja, genau dort liegt der Hund begraben.

Das Feld ist als static deklariert, d.h. es gilt nicht fürs Objekt sondern für die Klasse, es ist also egal wie oft du ein Objekt davon erstellst. Mach das static weg und fertig.

Btw würde ich bei einer Factory die Methode dann zu createMyClass umbenennen, getInstance gibts ehr beim Singleton.
 

stockhausen

Mitglied
Hallo Zusammen,

@HoaX: das Proeblem ist gelöst. Jedoch habe ich dir Erklärung noch nicht verstanden :(

Was meinst du mit "d.h. es gilt nicht fürs Objekt sondern für die Klasse" ?



Das Objekt der Klasse MyClass ist in meinem Beispiel als static deklariert.
Da es zusätzlich private ist, kann ich nur innerhalb der MyFactory Klasse darauf zugreifen.

Wenn ich ein Objekt der Klasse MyFactory in der Schleife erzeuge, wird pro Schleifendurchlauf

Java:
private static MyClass INSTANCE = new MyClass();


aufgerufen.


Warum wird bei der Verwendung von Static immer die gleiche Referenz zurück gegeben? Es ist ja KEIN Singelton konstrukt!

Kannst du bitte deine Aussage noch einmal "idiotensicher" erklären :)

Gruß,
Michael
 
Zuletzt bearbeitet:
G

Gast2

Gast
static = Klassenvariable

Sie wird einmal pro Klasse erzeugt.

Was du willst wäre so etwas:

Java:
public class MyFactory {
  
    public static MyClass newMyClassInstance() {
        return new MyClass();
    }
 
}

Was man z.b. machen kann ist die Factory als Singleton anlegen:

Java:
public class MyFactory {
   
    private static final MyFactory instance = new MyFactory();

    public static MyFactory getInstance(){
        return instance;
    }

    public MyClass newMyClassInstance() {
        return new MyClass();
    }
 
}

Dann kannst du machen [c]MyClass c = MyFactory.getInstance().newMyClassInstance();[/c]
 
Zuletzt bearbeitet von einem Moderator:

stockhausen

Mitglied
danke für die Zahlreichen Antworten :)

Folgendes habe ich gelernt:

Wenn ich in eine Klasse ein Objekt (A) als static deklariere, wird das Objekt (A) "nur ein einziges mal" bei der Initialisierung der Klasse erzeugt. Wenn ein Objekt (A) innerhalb einer Klasse mit static deklariert wurde, erhalte ich auch wenn ich 100 Instanzen der Klasse erzeuge, immer das gleiche Objekt (A).

Gruß,
Michael
 
M

maki

Gast
Wenn ein Objekt (A) innerhalb einer Klasse mit static deklariert wurde, erhalte ich auch wenn ich 100 Instanzen der Klasse erzeuge, immer das gleiche Objekt (A).
Naja, nicht wirklich, denn du erzeugst gar keine 100 Instanzen der Klassen, sondern nur eine einzige, Singleton eben ;)
 

stockhausen

Mitglied
Hallo maki,

ich meinte 100 Instanzen der Klassen MyFactory .
Darin wird immer die gleiche Instanz (singleton) der Klasse MyClass erzeugt.


Die Aussage:

Wenn ich in eine Klasse ein Objekt (A) als static deklariere, wird das Objekt (A) "nur ein einziges mal" bei der Initialisierung der Klasse erzeugt. Wenn ein Objekt (A) innerhalb der Klasse MyFactory mit static deklariert wurde, erhalte ich auch wenn ich 100 Instanzen der Klasse MyFactory erzeuge, immer das gleiche Objekt (A) bzw. Instanz der der Klasse MyClass.


Gruß,
Michael
 
M

maki

Gast
Hallo maki,

ich meinte 100 Instanzen der Klassen MyFactory .
Darin wird immer die gleiche Instanz (singleton) der Klasse MyClass erzeugt.
Auch falsch, nicht böse sein ;)

Instanzen, also Objekte, erzeugt nur mit dem Schlüsselwort new, davon hast du nur ein einziges, welches nur ein einziges mal bei der Initialisierung der Klasse ausgeführt wird.
 

eRaaaa

Top Contributor
Ich glaube er meint die Instanz der Factory, da erstellt er ja mehrere von innerhalb der Schleife !
Java:
        for(int i=0; i<2; i++) {
            MyFactory factory = new MyFactory();

aber das ist egal ja, du hast dann zwar verschiedene Factory-Objekte, aber die kennen alle nur die eine Instanz von MyClass (da das ja nicht an ein Objekt, sondern eben an die Klasse gebunden ist) . Was hier verwirrt, ist, dass der Klassenname(MyFactory) != der Klasse ist, welche dann intanziiiert und zurückgegeben wird(MyClass), was ja bei einem echten Singleton eher nicht der Fall ist?!
 

stockhausen

Mitglied
Bin dir überhaupt nicht böse. ich möchte das Ganze ja richtig verstehen :)

In dem obigen Beispiel habe ich folgendes geschrieben. Die Zahl 2 habe ich durch 100 ausgetauscht.

Beispiel 1
Java:
for(int i=0; i<100; i++) {
	MyFactory factory = new MyFactory();
	MyClass myClass = factory.getInstance();
	System.out.println(myClass);
}

Ich erzeuge bei Beispiel 1 100 Objekte der Klasse MyFactory. In MyFactory wird ein Objekt der Klasse MyClass erzeugt (weil static!).

Beispiel 2
Java:
MyFactory factory = new MyFactory();
for(int i=0; i<100; i++) {
	MyClass myClass = factory.getInstance();
	System.out.println(myClass);
}
Hier erzeuge ich ein Objekt der Klasse MyFactory und ein Objekt der Klasse MyClass (weil static!).
 

stockhausen

Mitglied
Was hier verwirrt, ist, dass der Klassenname(MyFactory) != der Klasse ist, welche dann intanziiiert und zurückgegeben wird(MyClass), was ja bei einem echten Singleton eher nicht der Fall ist?!

Jep, bei "echten Singleton" würde ich keine Factory-Klasse erstellen und den Konstruktor der MyClass als private deklarieren. Die getMyClassInstance() Methode würde sich auch in der MyClass Klasse befinden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
berserkerdq2 Ist JVM das gleiche wie IJVM (Bytecode) Java Basics - Anfänger-Themen 1
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
B Jsoup: gleiche Session nutzen Java Basics - Anfänger-Themen 0
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
CptK Interface Beide Panels zeigen das Gleiche Java Basics - Anfänger-Themen 2
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
B Prüfen, ob Datum2 der gleiche Tag ist wie Datum1 Java Basics - Anfänger-Themen 10
O Problem gleiche Zahlen Java Basics - Anfänger-Themen 2
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
N Array gleiche Datentypen zusammenrechnen Java Basics - Anfänger-Themen 28
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
L Gleiche Werte aus Array aussortieren Java Basics - Anfänger-Themen 5
L Gleiche Werte im Array hochzählen Java Basics - Anfänger-Themen 4
J Methoden Zwei Methoden die fast das gleiche tun organisieren Java Basics - Anfänger-Themen 3
L Classpath Zwei Bibliotheken enthalten gleiche .class Datei Java Basics - Anfänger-Themen 6
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
H überprüfen ob in Array gleiche int-Zahlen gespeichert werden. Java Basics - Anfänger-Themen 7
K Das Gleiche wiederholen Java Basics - Anfänger-Themen 5
Y Gleiche Arrays aus einem Array mit Objekten Java Basics - Anfänger-Themen 5
O Klasse in ArrayList speichern Problem -gleiche Speicheradresse Java Basics - Anfänger-Themen 2
M Zwei gleiche Eintraege in ArrayList finden Java Basics - Anfänger-Themen 15
D Javaliste auf gleiche Einträge überprüfen Java Basics - Anfänger-Themen 2
E Input/Output Drucken am Mac immer gleiche Schriftgröße?!? Java Basics - Anfänger-Themen 2
I immer die gleiche Zufallszahl Java Basics - Anfänger-Themen 9
L Eine ArrayList auf gleiche Inhalte prüfen Java Basics - Anfänger-Themen 10
M Erste Schritte Eclipse führt immer das gleiche Programm aus Java Basics - Anfänger-Themen 6
J Objekterzeugung im Konstruktor - Mehrfach gleiche Referenzvariable? Java Basics - Anfänger-Themen 4
A Mehrere Gegner sollen das gleiche Bild benutzen Java Basics - Anfänger-Themen 3
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
M gleiche Box in GUI mehrmals verwenden Java Basics - Anfänger-Themen 5
A objekt innerhalb der gleiche klasse Java Basics - Anfänger-Themen 10
S Dasselbe ist nicht das gleiche? Java Basics - Anfänger-Themen 7
K Datentypen Gleiche Zufallszahlen in verschiedenen Datenstrukturen Java Basics - Anfänger-Themen 6
G Gleiche Elemente in Feld zählen Java Basics - Anfänger-Themen 13
B 2D-Array, gleiche Einträge prüfen Java Basics - Anfänger-Themen 5
B Random() gleiche Zahlen ausschließen Java Basics - Anfänger-Themen 30
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
N Threads: 4 Threads, 4mal Zugriff auf Array soll nicht der gleiche Zugriff sein Java Basics - Anfänger-Themen 4
F Gleiche JUnit-Tests automatisert mit verschiedenen Methoden ausführen Java Basics - Anfänger-Themen 6
O Zweidemensionales Array auf zwei gleiche Zahlen prüfen Java Basics - Anfänger-Themen 15
D Methode in einer anderen Methode (gleiche Klassse) aufrufen Java Basics - Anfänger-Themen 11
G Der Gleiche oder der Selbe? Java Basics - Anfänger-Themen 6
G Zählen gleiche Werte in Array Java Basics - Anfänger-Themen 5
Gama 2 (fast) gleiche Dateien - nur eine funktioniert Java Basics - Anfänger-Themen 2
B Gleiche Ordner löschen Java Basics - Anfänger-Themen 15
V Vector/Arraylist hat nur gleiche Einträge Java Basics - Anfänger-Themen 3
G Warum das Prog mehrmals das gleiche macht wegen ItemListener Java Basics - Anfänger-Themen 4
Z Feld prüfen ob 3 gleiche zahlen nach einander vorkommen Java Basics - Anfänger-Themen 3
E Gleiche Methode einer (Kinds?)Klasse erneut aufrufen Java Basics - Anfänger-Themen 2
G gleiche Strings ungleich? Java Basics - Anfänger-Themen 5
K Neue Werte für gleiche Array-Indexe Java Basics - Anfänger-Themen 16
G Gleiche Aktionen verarbeiten (aber nur einmal Code)? Java Basics - Anfänger-Themen 2
M bewirken diese Schreibweisen das gleiche? :) Java Basics - Anfänger-Themen 8
F zugriff auf gleiche klasse aus mehreren klassen. Java Basics - Anfänger-Themen 3
G 2 gleiche Strings Java Basics - Anfänger-Themen 2
Z Vector führt mehrer, aber gleiche Elemente Java Basics - Anfänger-Themen 6
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
O Mit Instanz von Oberklasse auf Unterklasse zugreifen Java Basics - Anfänger-Themen 2
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
T Auf Instanz der selben Klasse aus überschriebener Methode in Methode zugreifen. Java Basics - Anfänger-Themen 2
T Inhalt aus TextField in Attribut einer Instanz schreiben Java Basics - Anfänger-Themen 5
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
I Instanz einer anderen Klasse zurückgeben Java Basics - Anfänger-Themen 34
G Unterschied Instanz- Klassenvariable Java Basics - Anfänger-Themen 11
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
F OOP Instanz einer Klasse an eine andere weitergeben Java Basics - Anfänger-Themen 16
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
BadBat Klassen instanz als variable + methodenaufruf Java Basics - Anfänger-Themen 4
T Auf Instanz einer Liste zugreifen Java Basics - Anfänger-Themen 2
M Neu instanzierte Klasse übernimmt Werte von anderer Instanz Java Basics - Anfänger-Themen 4
P Instanz mit .add Methode von einer Klasse zur anderen? Java Basics - Anfänger-Themen 6
H Klassen Von Instanzvariablen auf Instanz schließen Java Basics - Anfänger-Themen 21
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S Klassen Instanz anderer Klasse raus geben Java Basics - Anfänger-Themen 1
B Klassen Auf Instanz anderer Klasse zugreifen Java Basics - Anfänger-Themen 1
U JavaFX eine Vbox Instanz pro Pane? Java Basics - Anfänger-Themen 2
D Instanz einer Subklasse anhand deren Superklasse Java Basics - Anfänger-Themen 5
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
O OOP Methoden bei erstellen einer Instanz und mehr Java Basics - Anfänger-Themen 4
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
E Von Instanz des Dialogs auf das Frame zugreifen Java Basics - Anfänger-Themen 8
kaoZ Android Programmierung / Erstellen einer neuen Instanz Java Basics - Anfänger-Themen 2
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
G Undefined Instanz/Konstruktoraufruf Java Basics - Anfänger-Themen 8
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
M Initialisierungsblock beim Erzeugen einer Instanz Java Basics - Anfänger-Themen 6
J Instanz durch String Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben