Pattern sind eine Möglichkeit, um optimale Verfahren und gute Entwürfe zu
beschreiben. Sie zeigen eine flexible Lösung für verbreitete Programierprobleme.
Das Factory Pattern erlaubt die Instantiierung von Objekten zur Laufzeit.
Es wird Factory Pattern genannt, weil es für die Herstellung eines Objektes
zuständig ist. Eine parametrisierte Factory bekommt den Namen der zu
instantiierenden Klasse als Parameter übergeben.
Beispiel 19-24. Parametrisierte Factorymethode
<?php class Example { // Die parametrisierte Factorymethode public static function factory($type) { if (include_once 'Treiber/' . $type . '.php') { $classname = 'Treiber_' . $type; return new $classname; } else { throw new Exception ('Treiber nicht gefunden'); } } } ?>
|
Wenn diese Methode in einer Klasse definiert wird, erlaubt sie dieser,
Treiber bei Bedarf zu laden. Wenn die Beispiel Klasse
eine Datenbankabstraktionsklasse wäre, könnte das Laden eines
MySQL und SQLite Treibers wie
folgt aussehen:
<?php // Lade den MySQL Treiber $mysql = Beispiel::factory('MySQL');
// Lade den SQLite Treiber $sqlite = Beispiel::factory('SQLite'); ?>
|
|
Das Singleton Pattern greift in Situationen, in denen es nur eine Instanz
einer Klasse geben darf. Das gebräuchlichste Beispiel ist eine
Datenbankverbindung. Die Implementierung dieses Musters erlaubt dem Programmierer
diese einzige Instanz leicht für viele andere Objekte zugänglich zu machen.
Beispiel 19-25. Singleton Funktion
<?php class Beispiel { // Speichert die Instanz der Klasse private static $instance; // Ein private Konstruktor; verhindert die direkte Erzeugung des Objektes private function __construct() { echo 'Ich bin hergestellt'; }
// Die Singleton Funktion public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; }
return self::$instance; } // Beispielmethode public function bellen() { echo 'Wuff!'; }
// Halte Benutzer vom Klonen der Instanz ab public function __clone() { trigger_error('Klonen ist nicht erlaubt.', E_USER_ERROR); }
}
?>
|
Dies erlaubt das Abrufen einer einzigen Instanz der Beispiel
Klasse.
<?php // Das wird fehlschlagen, weil der Kosntruktor private ist $test = new Beispiel
// Das wird immer eine einzige Instanz der Klasse abrufen $test = Beispiel::singleton(); $test->bellen();
// Das wird einen E_USER_ERROR ausgeben $test_clone = clone($test);
?>
|
|