Factory-Pattern

04 Aug 2015
by marc
Comments are closed

Mit einem Factory-Pattern kann man eine Klasse erzeugen ohne unbedingt den Konstruktor dieser Klasse zu nutzen. Es kann vorkommen das man das nicht möchte oder auch nicht kann. Man erstell also zwei Klassen. Eine normale Klasse und eine zweite Klasse, welche unsere Factory-Klasse ist. Unsere Factory-Klasse besitzt Methoden die ein Objekt der ersten Klasse zurückliefern.

Anwendungsmöglichkeiten gibt es dafür für genug. Ich möchte euch ein Beispiel an Hand eines Datenbank-Mapper zeigen.

 


class Datenbank {
	private $host = null;
 
	public function __construct() {
		$this->host = "mysql.local";
	}
 
	public function setHost($newhost) {
		$this->host= $newhost;
	}
 
	public function getHost() {
		return $this->host;
	}
}

Unsere Hauptklasse oder erste Klasse steht. Wir können uns nun den Host zur Datenbank holen oder neu Setzen. Jetzt brauchen wir noch die Factory-Klasse.


class DatenbankFactory {

    private function __construct() {

    }

    public static function getDatenbankUser() {
        return self::getDatenbank("berlin.db.de");
    }

    public static function getDatenbankMandant() {
        return self::getDatenbank("london.db.de");
    }

    private static function getDatenbank($host) {
        $db = new Datenanbank();
        $db->setHost($host);
        return $db;
    }
}

Jetzt haben wir die Public-Methoden die uns den Datenbank-Host für User oder/und uns den für die Mandanten liefert. Eine Private Methode die unsere Anfrage erstellt. Wie man das macht seht ihr im folgenden Beispiel.


$hosteins = DatenbankFactory::getDatenbankUser();
print "DantenbankHost User ".$hostEins->getHost();

$hostZwei = DatenbankFactory::getDatenbankMandant();
print "DatenbankHost Mandant ".$hostZwei->getHost();

Wie wir sehen haben wir jetzt ein gutes Beispiel erzeugt wie wir Factory-Klassen mit PHP realisieren. Wenn wir jetzt die Klassen dementsprechend erweitern, können wir daraus einen einen Mapper für unsere Datenbank erstellen.

 

Die Nachteile des Pattern ist eher der Overhead da man immer zwei Klassen erstellen muss. Für kleine bis mittlere Projekte ist das akzeptabel, für Größere sollte man sich evtl. für ein anderes Pattern entscheiden.

EWU Software GmbH © 2018