Forum und email

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.

Example#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');
?>

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.

Example#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;

?>