JavaScript Objektorientierte Muster: Factory Pattern

Die Organisation von Code erspart uns eine Menge Ärger. Mit den Funktionen der objektorientierten Programmierung können wir bestimmte Entwurfsmuster einsetzen, um eine bessere Lesbarkeit zu erreichen, Redundanz zu reduzieren und bei Bedarf Abstraktionen zu schaffen. Ein solches Muster ist das Fabrikmuster.

Das Fabrikmuster ist eine Art objektorientiertes Muster, das der DRY-Methodik folgt. Wie der Name schon sagt, werden Objektinstanzen durch die Verwendung einer Fabrik erzeugt, die das benötigte Objekt für uns herstellt.

Schauen wir uns ein sehr einfaches Beispiel für die Verwendung des Fabrikmusters an, um ein alligator Objekt zusammenzustellen. Dazu müssen wir zunächst Fabriken erstellen, die die alligator-Teile für uns erzeugen:

class TailFactory { constructor(props) { this.tailLength = props.tailLength; }};class TorsoFactory { constructor(props) { this.color = props.color; }};class HeadFactory { constructor(props) { this.snoutLenth = props.snoutLenth; }};

Nun erstellen wir eine Klasse, die als Vermittler zwischen den eigentlichen Fabrikklassen und dem Benutzer fungiert. Nennen wir sie ReptilePartFactory:

class ReptilePartFactory { constructor(type, props) { if(type === "tail") return new TailFactory(props); if(type === "torso") return new TorsoFactory(props); if(type === "head") return new HeadFactory(props); }};

Setzen wir nun den eigentlichen Alligator zusammen und verwenden die ReptilePartFactory, um die benötigten Teile für uns zu erhalten:

let alligator = {};let alligatorProps = { tailLength : 2.5, color: "green", snoutLenth: 1};//gets a tail from the tail factoryalligator.tail = new ReptilePartFactory("tail", alligatorProps); //gets a torso from the torso factoryalligator.torso = new ReptilePartFactory("torso", alligatorProps);//gets a head from the head factoryalligator.head = new ReptilePartFactory("head", alligatorProps);

Wenn man sich das obige Muster ansieht, scheint es, als könnten wir dieselbe ReptilePartFactory verwenden, um Teile für alligatorähnliche Objekte zu erstellen. Die Fabriken im Hintergrund müssten nie etwas über die Beschaffenheit des endgültigen Objekts erfahren.

Die Verwendung des Fabrikmusters bietet uns also bestimmte Vorteile:

  • Dynamische Objekterzeugung: Es kann in Fällen verwendet werden, in denen der Typ des Objekts zur Laufzeit entschieden wird.
  • Abstraktion: Der Benutzer muss nie wirklich auf den Konstruktor des eigentlichen Objekts zugreifen.
  • Wiederverwendbarkeit/Wartung: Dieselben Fabriken können für ähnliche Objekte verwendet werden, und es erlaubt uns, neue Objektklassen einfach hinzuzufügen/zu entfernen, ohne eine Menge Code zu ändern.

Nun, da wir das Factory Pattern einigermaßen verstanden haben, wollen wir uns ein wenig mit dem Schreiben von besserem Factory Pattern Code befassen.

Das obige Beispiel verwendet eine If-Ladder, um herauszufinden, welche Fabrik auf der Grundlage von Benutzereingaben aufgerufen werden soll. Dies ist eine einfache Implementierung, intuitiv und nicht sehr offen für Änderungen. Wenn wir später neue Teile hinzufügen wollen, müssten wir die ReptilePartFactory stören. Dies ist ein Verstoß gegen die SOLID-Prinzipien, die besagen: „Software-Entitäten (Klassen, Module, Funktionen usw.) sollten offen für Erweiterungen, aber geschlossen für Änderungen sein“.

Wie wäre es, wenn wir die Fabrikklassen in einem Objekt speichern und die gewünschte Teilefabrik mit dem gewünschten Teil als Schlüssel aufrufen? Zuerst müssten wir die Fabriken registrieren, das wäre so einfach wie:

let registeredPartFactories = {};registeredPartFactories = class TailFactory{ ...};registeredPartFactories = class TorsoFactory { ...};registeredPartFactories = class HeadFactory { ...};

Und nun kann die abstrakte Schicht die Fabriken wie folgt aufrufen:

class ReptilePartFactory { constructor(type, props) { return new registeredPartFactories(props); }};

Dieser Ansatz ist viel sauberer und ermöglicht es, unsere Fabriken zu erweitern, ohne den Code in der ReptilePartFactory.

Zusammenfassend

Es gibt noch mehrere andere objektorientierte Muster, die ebenfalls die Lesbarkeit und Qualität erhöhen. Bevor Sie also das Factory-Pattern verwenden, prüfen Sie, ob es wirklich erforderlich ist. Wenn Sie ähnliche Arten von Objekten wiederholt erstellen wollen und außerdem eine Schicht benötigen, um neue Instanzen unter Verwendung dieser Objekte zu erstellen und dabei ein gewisses Maß an Abstraktion für die Erstellungslogik bereitzustellen, dann ja – dann ist das Factory-Pattern eine gute Option.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.