Factory-Klasse (Thema: PHP Beispiele)

Allgemeines zum Factory-Pattern in PHP und ein Beispiel zur Implementierung

1. Einleitung

Das Factory Pattern bzw. Abstract Factory Pattern ist ein Entwurfsmuster, welches dem Entwickler eine „Richtschnur” für das Entwickeln von Klassen gibt, die wiederum zur Erzeugung anderer Klassen gedacht sind. Solche Klassen werden als Factories bezeichnet. Nach dem Factory Pattern gibt es ein gemeinsames Interface für eine Gruppe von Factories, die dem selben Ziel dienen, also die im Kontext selben/ähnlichen Objekte erzeugen. Das Interface wird von diesen Factories implementiert. Die Factories können nun beliebig ausgetauscht werden, um die erzeugten Objekte zu ändern, wobei alle erzeugten Objekte die selbe Oberklasse oder das selbe Interface beibehalten sollten. So könnte es zum Laden bestimmter Daten eine Factory geben, die diese aus der Datenbank einlädt und eine zweite, die sie aus einer Backup-Datei entnimmt. Je nachdem, ob die Datenbank verfügbar ist oder nicht wird erstere oder letztere Factory zum Laden der Daten verwendet.

2. Beispiel

In diesem Beispiel wird eine Factory „MyProductFactory” definiert, welche Objekte der Klasse „Product” erzeugt, wenn die Methode „createProduct($id)” aufgerufen wird. Hier ist die Erzeugung der Objekte fest einprogrammiert. Denkbar wäre es aber auch, diese aus einer Datenbank oder per URL von einem anderen Server abzufragen. Diese Lademethoden könnten dann in anderen Factories umgesetzt werden.

PHP-Code: Eine einfache Factory, die von anderen Objekten genutzt werden kann, um Product-Objekte zu erzeugen
<?php
	/**
	 * Eine beispielhafte Klasse, welche Produkte mit ihrer ID und Name enthält.
	 */
	class Product {
		private $id;
		private $name;

		public function __construct($id, $name) {
			$this->id = $id;
			$this->name = $name;
		}

		public function getId() {
			return $this->id;
		}

		public function getName() {
			return $this->name;
		}
	}


	/**
	 * Eine einfache Factory-Klasse, die bei Aufruf von createProduct()
	 * anhand der ID-Nummer die Objekte erzeugt. Hier ist die Erzeugung fest
	 * einprogrammiert, sie könnten aber z. B. auch aus der Datenbank ausgelesen werden.
	 */
	class MyProductFactory {
		public function createProduct($id) {
			switch ($id) {
				case 1: return new Product(1, 'Tisch 2000 Deluxe Edition');
				case 2: return new Product(2, 'Elite Regal');
				case 3: return new Product(3, 'Offroad Stuhl');
				default: return null;
			}
		}
	}

	// Beispielhaft werden ein Tisch und ein Stuhl erzeugt
	// und die Namen der Produkte ausgegeben
	$factory = new MyProductFactory();
	$tisch = $factory->createProduct(1);
	$stuhl = $factory->createProduct(3);
	var_dump($tisch->getName());
	var_dump($stuhl->getName());
?>

HTML-Code: Ausgabe
string(25) "Tisch 2000 Deluxe Edition"
string(13) "Offroad Stuhl"


Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK