Factory

masterjule

Mitglied
Hallo,

ich habe ein kleines Übungprogramm, welches die Fakultät einer Zahl berechnet.
Ich habe ein Interface und vier Implementierungen, dazu noch eine Factory Klasse zur Erzeugung.
Ist es möglich, dass Programm so zu gestalten, dass bei einer neuen Implementierung des Interfaces die Factory Klasse nicht geändert werden muss?

Gruß
Julian
 
T

Tomate_Salat

Gast
Meinst du soetwas:
Java:
public interface IColor {
    public int getRGB();
}

public final class ColorFactory {
     private ColorFactory() {}

     private static Map<String,IColor> colorMap=new HashMap<String,IColor>();

     public static IColor getColor(String ref) 
     {
           return colorMap.get(ref);
     }

     public static void registerColor(String ref, IColor color) 
     {
            map.put(ref,color);
     }
}
 

_Andi91

Bekanntes Mitglied
ja ist möglich.
bsp.
du hast das Interface IFak und die Factory FakFact im package test
die impl Klassen für das Interface IFak hast du im package test.impl
bsp. Klassennamen Impl1, Impl2
die Factory hat eine Methode IFak getFak der du einen String übergeben kannst. Dieser String entspricht dem einfachen Klassenname der impl Klasse (also Impl1 oder Impl2).
In der Factory lädst du dir dann die Klasse test.impl. + uebergebener Klassenname, erzeugst eine neue Instanz dieser und gibst diese zurück.
Wäre ein möglicher Ansatz...
 
S

SlaterB

Gast
falls Objekte einer Klasse erzeugt werden sollen, ist das ohne direkte Kenntnis der Klasse ( == Factory ändern)
im eigentlichen Sinne nur per Reflection möglich, nicht schön aber denkbar,

indirekt könnte noch funktionieren, dass die neue Klasse selber eine Art Factory ist,
und die Haupt-Factory nur über Interface die Unter-Factory aufruft,
das wäre noch human, aber nicht unbedingt ganz Factory-mäßig ;)
 

masterjule

Mitglied
schonmal danke für die Antworten.
Ich habe ein Enum, mit dem ich die Implementierungen identifiziere.
Kann man irgendwie das Enum als Klassenname für die neue Instanz verwenden?
 
S

SlaterB

Gast
ein Klassenname ist ein String, ein Enum hat einen Namen der ein String sein könnte,
die Zusammenhänge sind nicht offensichtlich?
 

masterjule

Mitglied
hm.. ich steh grad auf'm Schlauch.
Ich rufe die Factory mit einem Enum als Parameter auf. Wie erzeuge ich dann aus dem Enum Namen die entsprechende Klasse?
 
S

SlaterB

Gast
wie nicht?

zudem braucht es Beispiele, ich weiß nicht was du im Detail meinst,

wenn du einen Klassenamen "Klasse3" suchst und einen Enum-Wert Klasse3 hast, dann doch nur den Enum in String umwandeln,
wo genau besteht die Frage, welcher exakten Codeschritt oder was genau sonst meinst du?
Enum hat Methoden wie toString(), name() usw., alles in Ruhe anschauen und ausprobieren
 
B

bygones

Gast
Java:
public enum Foo {
 Bar("de.somewhere.class1"), Blub("de.somewhere.class2");

 private String className;
 
 private Foo(String cn) {
   className = cn;
 }

 public String getClassName() {
   return className;
 }
}

public final class Factory {
  private Factory() {
  }

  public <INSERT> get(Foo foo) {
    return Class.forName(foo.getClassName());
 }
}
zb
 
T

Tomate_Salat

Gast
So z.B.:
Java:
enum EFactory 
{
	PUBLIC("PUBLIC.ID"), PRIVATE("PRIVATE.ID");
	
	private String resId;
	
	private EFactory(final String id) 
	{
		this.resId=id;
	}
	
	public String getId()
	{
		return resId;
	}
}
 

masterjule

Mitglied
Wäre das dann so ok?
Java:
Factorial f = (Factorial) Class.forName("j002." +  actorialClasses.FactFor.toString()).newInstance();
 
Zuletzt bearbeitet:
S

SlaterB

Gast
wäre es schwer das vorher zu testen?

wahrscheinlich fehlt die package-Angabe zur Klasse,
die Varianten der anderen Posts könnten das besser behandeln,
oder manuell ergänzen, falls das auf irgendeine Weise möglich ist
 

masterjule

Mitglied
hab die Package Angabe dazu gemacht und der erste Versuch war auch erfolgreich.
Also schonmal Danke an auch :)

Zum Enum, wenn ich da, wie in den anderen Beispielen, in Klammer einen String dazu mache kommt ein Fehler (required: no arguments). Ich gehe mal davon aus, dass ich irgendwas falsch mache.. ???:L
 
S

SlaterB

Gast
fehlt ein entsprechender Konstruktor wie in den genannten Beispielen?
du musst die Strings ja auch abspeichern, einen getter schreiben und den auch verwenden ..
 

Ähnliche Java Themen

Neue Themen


Oben