Daniel Thoma: / (PHP) OOP vs. gekapselte Funktionen

Beitrag lesen

Hallo Tom,

Factory und Factory-Methode sind erstmal zwei verschiedene Muster. Beide dienen sie dazu, von der Erzeugung eines Objektes zu abstrahieren. Das hat nichts mit imperativer Programmierung zu tun, man könnte eine Factory höchstens noch durch eine Funktionsreferenz ersetzen.

Beispiel, eine Klasse, die graphisch eine Liste darstellt. Dazu werden Objekte benötigt, die einen einzelnen Eintrag darstellen. Die Implementierung soll aber nicht direkt festgelegt werden:

abstract class Liste {

void draw(Objekt[] objekte) {...}
  void abstract neuerEintrag();

}

interface Eintrag {
  void draw(Objekt o);
}

"neuerEintrag" ist eine Factory-Methode. Nun kann es passieren, dass man mehrere Klassen hat, die Objekte für die Schnittstelle Eintrag erzeugen wollen. Daher möchte man "neuerEintrag" nicht immer neu implementieren sondern auslagern:

interface EintragFactory {
  void neuerEintrag();
}

class Liste {

Liste(EintragFactory f) {...}

void draw(Objekt[] objekte) {...}

}

Nun ist auch keine Erweiterung der Klasse Liste mehr notwendig, man kann direkt eine entsprechende Implementierung von EintragFactory dem Konstruktor übergeben.

Alternativ ist es möglich Funktions- bzw. Methodenreferenzen zu verwenden, wenn die Sprache dies unterstützt, dann würde der Konstruktor irgendwie so deklariert:

Liste([void -> Eintrag] f) {...}

Factories können natürlich komplexer sein und die Erzeugung verschiedener Objekte ermöglichen oder Information über die erzeugten Objekte bereitstellen, das ist aber eher selten der Fall.

Grüße

Daniel