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 #1 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 #2 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;
?>