Design Patterns in PHP - Teil 4: Das Factory Pattern

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:



  1. <?php
  2. interface dbObject_interface {
  3.  
  4. 	public function dbSetStatement($strSQLStatement);
  5. 	public function dbFetchArray();
  6. 	public function dbFetchObject();
  7. 	public function dbFetchRow();
  8.  
  9. }
  10.  
  11. class dbObject_mysql implements dbObject_interface {
  12. 	.
  13. 	.
  14. 	.
  15. 	public function dbSetStatement($strSQLStatement) {
  16. 		// code
  17. 	}
  18. 	public function dbFetchArray() {
  19. 		// code
  20. 	}
  21. 	public function dbFetchObject() {
  22. 		// code
  23. 	}
  24. 	public function dbFetchRow() {
  25. 		// code
  26. 	}
  27. 	.
  28. 	.
  29. 	.
  30. }
  31.  
  32. class dbObject_postgresql implements dbObject_interface {
  33. 	.
  34. 	.
  35. 	.
  36. 	public function dbSetStatement($strSQLStatement) {
  37. 		// code
  38. 	}
  39. 	public function dbFetchArray() {
  40. 		// code
  41. 	}
  42. 	public function dbFetchObject() {
  43. 		// code
  44. 	}
  45. 	public function dbFetchRow() {
  46. 		// code
  47. 	}
  48. 	.
  49. 	.
  50. 	.
  51. }
  52. ?>

Nun ist sichergestellt, dass mindestens diese 4 Funktionen nach aussen weitergegeben werden. Nun können wir unser Factory-Objekt erstellen:

  1. <?php
  2.  
  3. class dbObject {
  4.  
  5.   public function __construct( $strDatabaseType ) {
  6. 	// Hier sollte man später mittels Exceptionhandler & z.B.
  7. 	// __autoload und class_exists() etwas sicherer agieren.
  8. 	$myObject = 'dbObject_'.strtolower($strDatabaseType);
  9. 	return new $myObject();
  10.   }	
  11. }
  12.  
  13.  
  14. $myDBMysql      = new dbObject('mysql');
  15. $myDBPostgres	 = new dbObject('postgresql');
  16. ?>

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.

Neuen Kommentar schreiben

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.