Java Factory Method
Es ist eine Methode, die Objekte einer Java Klasse erstellt und zurückgibt, ohne den Konstruktor direkt aufzurufen.
Sie ermöglicht es, die OOP zu kontrollieren, z. B. durch Wiederverwendung einer bestehenden Instanz (wie im Singleton-Muster) oder das Zurückgeben verschiedener Unterklassen.
Die Java Methode wird häufig stattnew
verwendet, um eine klarere, flexiblere API zu schaffen.
Syntax
class ClassName {
// Private Konstruktor, damit keine Instanzen direkt erstellt werden können
private ClassName() {
// Initialisierungscode
}
// Static Factory Method
public static ClassName createInstance() {
return new ClassName(); // Gibt eine neue Instanz der Klasse zurück
}
}
public class Main {
public static void main(String[] args) {
ClassName obj = ClassName.createInstance(); // Erstellen eines Objekts über die Factory-Methode
}
}
Bsp
class Logger {
// Eine statische Variable, die die Singleton-Instanz hält
private static Logger instance;
// Privater Konstruktor, um die Instanziierung von außen zu verhindern
private Logger() {
System.out.println("Logger instance created");
}
// Static Factory Method, die kontrolliert eine Instanz zurückgibt
public static Logger getInstance() {
if (instance == null) {
instance = new Logger(); // Erstellt die Instanz nur, wenn sie noch nicht existiert
}
return instance;
}
// Beispielmethode zum Protokollieren von Nachrichten
public void log(String message) {
System.out.println("Log: " + message);
}
}
public class Main {
public static void main(String[] args) {
// Verwenden der Static Factory Method, um die Logger-Instanz zu erhalten
Logger logger1 = Logger.getInstance();
logger1.log("This is the first log message."); // Ausgabe: Log: This is the first log message.
// Ein zweiter Aufruf von getInstance() gibt dieselbe Instanz zurück
Logger logger2 = Logger.getInstance();
logger2.log("This is the second log message."); // Ausgabe: Log: This is the second log message.
// Überprüfen, ob beide Referenzen auf dasselbe Objekt zeigen
System.out.println(logger1 == logger2); // Ausgabe: true
}
}