“Factory Method”

Post von realloc | Einsortiert in Code am 14. Februar 2007 | Keine Kommentare

Das Entwurfsmuster “Factory Method” definiert eine Schnittstelle (Interface) zur Erzeugung von Objekten. Dabei überläßt sie es den Unterklassen, von welchem Typ die erzeugten Objekte sind.

Soviel zum theoretischen Teil … Um ein einfaches Beispiel für das “Factory Method”-Pattern zu geben, gehe ich von folgender Situation aus. filemtime liefert mir Datum und Uhrzeit der letzten Änderung einer Datei. Diese Information liegt dann entweder als timestamp vor oder ist im Fehlerfall FALSE.

Das könnte man in etwa so formulieren, um ein Beispiel zu geben, welches etwas praxisnaher ist:

<?php

class Factory {

    function create ($file) {
        if (file_exists ($file) && ($mtime = filemtime ($file))) {
            return new CMtime ($mtime);
        }
        return new CError ();
    }

}

class Generic {
    var $_timestamp;
    var $_template = 'Es wurde kein Templatestring definiert!';

    function Generic ($timestamp) {
        $this->_timestamp = $timestamp;
    }

    function repr () {
        return (
            str_replace (
                '{replace}',
                date ('d.m.Y um H:i Uhr', $this->_timestamp),
                $this->_template
            )
        );
    }

}

class CMtime extends Generic {
    var $_template = "Am {replace} wurde die Datei geaendert. ";

}

class CError extends Generic {
    var $_template = "Es ist ein Fehler aufgetreten!";

    function CError () {}

}

?>

In meinem Beispiel habe ich eine Klasse Generic definiert, die in ihrer Constructor-Methode einen timestamp entgegen nimmt und uns außerdem eine repr-Methode zur Verfügung stellt, die bei einer definierten Zeichenkette eine Ersetzung und Formatierung des timestamps durchfürt und das Ergebnis zurückliefert. Alle abgeleiteten Klassen stellen für die Ausgabe eigene Templatestrings bereit. Falls ein Fehler bei filemtime auftritt, soll das zurückgelieferte Objekt vom Typ CError sein.

Die Lösung dann im Einsatz:

<?php

/* gibt z.B. 'Am 05.03.2007 um 12:12 Uhr wurde die Datei geaendert.' aus. */
$obj = Factory::create (__FILE__);
print $obj->repr ();

/* gibt 'Es ist ein Fehler aufgetreten!' aus */
$obj = Factory::create ("nicht-existierende-datei");
print $obj->repr ();

?>

Have fun!

Möglicherweise interessiert Dich auch...



Einen Kommentar schreiben