Klassen Factory und Dynamsiche KlassenNamen

Timo Frenzel

Mitglied
Hi,
ich versuche gerade die ersten Schritte mit Java und habe ein kleines Problem..
ich habe hier ein Beispiel gefunden das das ganze gut zeigt.

Java:
package headfirst.factory.pizzas;

public class EinfachePizzaFabrik {

	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals("Salami")) {
			pizza = new SalamiPizza();
		} else if (type.equals("Thunfisch")) {
			pizza = new ThunfischPizza();
		} else if (type.equals("Krabben")) {
			pizza = new KrabbenPizza();
		} else if (type.equals("Vegetarisch")) {
			pizza = new VegetarischePizza();
		}
		return pizza;
	}
}

Ich wollte das ganze in einem Switch laufen lassen, was aber ja nicht funktioniert, das switch nur Byte, Char,... akzeptiert.

Also habe ich mich auf ein Zuweisungsarray gestützt.
Und möchte nun statt x verschiedene Aufrufe hier nur einen haben, der Dynamisch passiert, anhand es Prefixes.



Java:
String[] zahlen = { "salami", "thunfisch", "vegetarisch", "bacon" };
		String ergebnis = "-1";
		for (int i=0; i<zahlen.length; i++) {
		  if (zahlen[i].equals(prefix)){
			  ergebnis = Integer.toString(i+1);
		  }
		}
		if(ergebnis != "-1"){
			System.out.println(ergebnis);
			String sClassName = prefix.toUpperCase()+"Pizza";
			Class pizza = sClassName.getClass();
			Object obj = pizza.newInstance();
		}else{
			System.out.println("Kein passendes Prefix gefunden: " + prefix + " (Pizza | PizzaFactory.java)");
		}

Und hier ist das Problem.
Ich erhalte hier "Object obj = pizza.newInstance();" den Datentyp "Object", ich brauche aber den Typ "Pizza", den mit die Klassen xxxPizza zurück geben würden.

Hoffe hierk ann mir einer helfen und versteht mich^^

Unter PHP war es einfach:
PHP:
$sName = prefix."Pizza";
$oPizza = new $sName():
 
G

Gast2

Gast
Das könntest du mittels Reflection lösen.

Denke aber das geht für den Einstieg vielleicht etwas zu weit.
 

Timo Frenzel

Mitglied
Das könntest du mittels Reflection lösen.

Denke aber das geht für den Einstieg vielleicht etwas zu weit.

Also müsste ich wie ich vermutet habe mit
Java:
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
...

meine Class c durchlaufen, die Methoden holen und eine eigene Klasse mit diesen füllen um mit diesen weiter zu arbeiten?
Somit würden dann die durch die Factory aufgerufenen Klassen wegfallen, da ich diese Klasse immer on the fly spezifisch für das prefix erstellen würde, oder lieg ich da falsch?

Und ja, das führt dann für den Anfang zu weit^^
 

Marco13

Top Contributor
Java:
String sClassName = prefix.toUpperCase()+"Pizza";
Class pizza = sClassName.getClass();
Object obj = pizza.newInstance();

Das 'Class pizza' dort ist die Klasse 'String' - sClassName ist schließlich ein String. Du kannst dir mit Class.forName(...) (voll qualifizierter Name) die Klasse holen, und die bei newInstance entstehende Instanz dann auch nach 'Pizza' casten.
 

Timo Frenzel

Mitglied
Java:
String sClassName = prefix.toUpperCase()+"Pizza";
Class pizza = sClassName.getClass();
Object obj = pizza.newInstance();

Das 'Class pizza' dort ist die Klasse 'String' - sClassName ist schließlich ein String. Du kannst dir mit Class.forName(...) (voll qualifizierter Name) die Klasse holen, und die bei newInstance entstehende Instanz dann auch nach 'Pizza' casten.

ok habe ich gemacht aber noch eien frage..

Java:
Pizza oPizza = (Pizza) (Class.forName(sClassName).newInstance());

mit newInstanz löse ich doch den Konstrukor der Pizza Klasse aus oder?
Wie gebe ich dem nun die benötigten Parameter mit?

Java:
Pizza oPizza = (Pizza) (Class.forName(sClassName).newInstance(para1,para2,...));

will er nicht
 
S

Spacerat

Gast
Jetzt wird man mich wahrscheinlich verfluchen, aber ich hätte an diese Stelle mal gerne was dynamisches ohne Reflection (siehe hier).
BTW.: Mir wäre da im übrigen auch nichts anderes bekannt.
Das die "newInstance()"-Methode das so nicht schluckt ist klar. Sobald man Parameter an den Konstruktor übergeben will, muss man sich den entsprechenden dazu per "getDeclaredConstructor()" aus der Klasse holen.
 
Zuletzt bearbeitet von einem Moderator:

snot

Mitglied
Hi,
ich versuche gerade die ersten Schritte mit Java und habe ein kleines Problem..
ich habe hier ein Beispiel gefunden das das ganze gut zeigt.

.....
Ich wollte das ganze in einem Switch laufen lassen, was aber ja nicht funktioniert, das switch nur Byte, Char,... akzeptiert.

....

Du kannst Enumeration verwenden, wenn du in einem Switch laufen lassen willst.

Java:
	public enum PizzaTyp {
		Salami, Vegetarisch, Thunfisch, Krabben
	};

Java:
Pizza erstellePizza(PizzaTyp typ) {
		switch (typ) {
		case Selami:
			return new SalamiPizza();

		case Vegetarisch:
...

Es hat den Vorteil, dass der Client schon beim Aufruf der Methode gezwungen wird, den richtigen Typen auszuwählen, z.B.
Java:
bestellePizza(PizzaTyp.Thunfisch)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Java Generics factory method Java Basics - Anfänger-Themen 2
Z Factory-Entwurfsmuster Java Basics - Anfänger-Themen 1
I Desing Patterns / Factory Java Basics - Anfänger-Themen 4
U UML Factory Method Java Basics - Anfänger-Themen 4
U Factory in anderer Klasse Java Basics - Anfänger-Themen 2
nrg Wohin mit Factory Methoden? Java Basics - Anfänger-Themen 3
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
D Factory Java Basics - Anfänger-Themen 7
S OOP Warum gleiche Instanz der Klasse? (Factory-Muster) Java Basics - Anfänger-Themen 13
A Factory Pattern Java Basics - Anfänger-Themen 2
M Factory mit String / Frage zu Generics Java Basics - Anfänger-Themen 2
M Factory Pattern Ansatz falsch? Java Basics - Anfänger-Themen 6
P Adaptor, Abstract Factory Java Basics - Anfänger-Themen 12
S Objektrückgabe durch Factory-Methode in abstrakten Klassen Java Basics - Anfänger-Themen 4
P Klassennamen Konvention Java Basics - Anfänger-Themen 3
Z Erste Schritte Klassennamen ausgeben lassen Java Basics - Anfänger-Themen 2
A Warum immer das "J" im Klassennamen? Java Basics - Anfänger-Themen 10
T Klassen Klassennamen zusammensetzen Java Basics - Anfänger-Themen 3
M Neues Objekt erzeugen mit Klassennamen oder ohne Java Basics - Anfänger-Themen 5
A Klassennamen im statischen Umfeld Java Basics - Anfänger-Themen 14
S Klassennamen ermitteln Java Basics - Anfänger-Themen 10
G Klassennamen extrahieren Java Basics - Anfänger-Themen 2
R Klassennamen ausgeben Java Basics - Anfänger-Themen 4
S Packetstruktur und Klassennamen auslesen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben