Hallo Markus,
ich blick durch dein Beispiel nicht wirklich durch
wie meinste denn das?
mit Factory:
db = DB.factory('mysql')
oder
db = DB.factory('oracle')
BZW was hab ich jetzt für Vorteile?
In dem Beispiel geht es darum, Klassen für den Datenbankzugriff zu erstellen. Wenn man mehrere Datenbanktypen (MySQL, PostgreSQL, Oracle, XML-Dateien, wasauchimmer) unterstützten will, verwendet man dafür z.B. Unterklassen einer abstrakten Klasse, also z.B.
abstract class DB {...}
class MySQLDB extends DB {...}
class PostgreSQL extends DB {...}
usw.
Wenn jetzt ein Objekt für den Datenbankzugriff erstellt werden soll, muss erst überprüfen werden, welche konkrete Klasse instanziiert werden soll:
if {config.dbtype == 'mysql') {
db = new MySQLDB();
elseif {config.dbtype == 'postgresql') {
db = new PostgreSQL();
} usw.
Genau diese Aufgabe kapselt man jetzt in einer Factory-Methode:
class DB {
...
static AbstractDB factory(String dbtype) {
if (dbtype == 'mysql')
db = new MySQLDB();
} ...
return db;
}
...
}
Diese Factory-Methode ruft man nun auf, um eine konkrete Instanz einer DB-Unterklasse zu erzeugen:
db = DB.factory(config.dbtype);
Auf den ersten Blick erscheint das unnötig kompliziert, aber es bringt einige Vorteile. Dadurch, dass die Logik zur Entscheidung welche konkrete Klasse verwendet werden soll an einer Stelle gespeichert ist, muss nur diese Stelle verändert werden, wenn neue Datenbanktypen hinzugefügt werden sollen. Außerdem braucht derjenige, der eine Datenbankklasseninstanz erzeugt gar nicht zu wissen, von welchem Typ diese Datenbank ist. Im obigen Beispiel wird z.B. einfach der Wert aus der Konfiguration durchgereicht.
Schöne Grüße,
Johannes