Das Factory Design Pattern wird immer dann eingesetzt, wenn man Objekte instanzieren will, deren Typ aber erst zur Laufzeit bekannt ist.
Klassisches Beispiel hierfür wäre z.B. ein Datenbankwrapper. Es existieren mehrerer identische Objekte, welche die selben Methoden zur Verfügung stellen, aber auf unterschiedliche Datenbanksystem zugreifen und deren Besonderheiten nach aussen hin "verstecken".
Um dies zu gewährleisten, sollte man mittels Interfaces sicherstellen, dass diese Objekte wirklich nach aussen transparent bzw. identisch sind:
-
<?php -
interface dbObject_interface {
-
-
public function dbSetStatement($strSQLStatement);
-
public function dbFetchArray();
-
public function dbFetchObject();
-
public function dbFetchRow();
-
-
} -
-
class dbObject_mysql implements dbObject_interface {
-
. -
. -
. -
public function dbSetStatement($strSQLStatement) {
-
// code -
} -
public function dbFetchArray() {
-
// code -
} -
public function dbFetchObject() {
-
// code -
} -
public function dbFetchRow() {
-
// code -
} -
. -
. -
. -
} -
-
class dbObject_postgresql implements dbObject_interface {
-
. -
. -
. -
public function dbSetStatement($strSQLStatement) {
-
// code -
} -
public function dbFetchArray() {
-
// code -
} -
public function dbFetchObject() {
-
// code -
} -
public function dbFetchRow() {
-
// code -
} -
. -
. -
. -
} -
?>
Nun ist sichergestellt, dass mindestens diese 4 Funktionen nach aussen weitergegeben werden. Nun können wir unser Factory-Objekt erstellen:
-
<?php -
-
class dbObject {
-
-
public function __construct( $strDatabaseType ) {
-
// Hier sollte man später mittels Exceptionhandler & z.B. -
// __autoload und class_exists() etwas sicherer agieren. -
$myObject = 'dbObject_'.strtolower($strDatabaseType);
-
return new $myObject();
-
} -
} -
-
-
$myDBMysql = new dbObject('mysql');
-
$myDBPostgres = new dbObject('postgresql');
-
?>
Dies waren jetzt erstmal alle Patterns, die ich im täglichen Gebrauch kennen und lieben gelernt habe. Die anderen Entwurfsmuster wie z.B. das Observer-Pattern oder das Decorator-Pattern habe ich mangels Verwendungszweck eher theoretisch kennengelernt.
Interessanter ist es wohl im täglichen Gebrauch mehrere Patterns zu kombinieren. So wäre es z.B. möglich, ein Objekt per Singleton zu instanzieren und dieses dann mittels Registry Pattern komplett zu speichern. Wenn man an z.B. eine Logging-Klasse denkt, wäre dies eventuell sogar über Prozessgrenzen hinweg sinnvoll (Filelocking...). Hier müsste dann das Registry das komplette Objekt z.B. in eine Datenbank oder einem sonstigen Speicher ablegen, der für jeden php-Prozess erreichbar ist.
Willkommen zum zweiten Teil meiner kleinen HowTo-Serie. Heute werde ich Euch zeigen, wie man einem Android-Handy zu einem Zugang zum OpenVPN-Server aus dem 



