PHP Handbuch
Zurück | Kapitel 19. Klassen und Objekte (PHP 5) | Weiter

# Pattern

Pattern sind eine Möglichkeit, um optimale Verfahren und gute Entwürfe zu beschreiben. Sie zeigen eine flexible Lösung für verbreitete Programierprobleme.

## Factory

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-25. 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'); ?>`

## Singleton

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-26. 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; ?>`

Zurück | Zum Anfang | Weiter
Objektiteration | Nach oben | Magische Methoden