Was ist das Factory Pattern?

Das Factory Pattern ist ein Design Pattern, das ein Interface, also eine Schnittstelle für die Erstellung von Objekten bietet, es aber den Unterklassen überlässt, welche Klasse sie instanziieren.

Wie funktioniert ein Factory Pattern?

Das Entwurfsmuster definiert eine abstrakte Klasse oder Schnittstelle für die Erstellung von Objekten, überlässt aber die tatsächliche Erstellung von Objekten den konkreten Unterklassen.

Entwurfsmuster für objektorientiertes Softwaredesign

Dadurch wird die Erstellung von Objekten vom Client-Code, der sie verwendet, entkoppelt, wodurch der Client-Code flexibler und wartbarer wird.

Komponenten des Factory-Pattern mit Code-Beispielen in JavaScript

Das Factory Pattern besteht aus den folgenden Komponenten:

Abstract Factory

Eine Schnittstelle oder abstrakte Klasse, die die Methode(n) zur Erstellung von Objekten definiert. Diese abstrakte Fabrik ist für die Definition der Schnittstelle zur Erstellung von Objekten verantwortlich, implementiert aber nicht die Erstellung von Objekten.

Concrete Factory

Eine konkrete Implementierung der abstrakten Fabrik, die für die Erstellung bestimmter Objekttypen zuständig ist. Die konkrete Fabrik ist für die Implementierung der Erstellung von Objekten auf der Grundlage der Anfrage des Kunden zuständig.

Was ist mit konkreter Implementierung gemeint?

Eine konkrete Implementierung der abstrakten Fabrik ist eine Variante des Fabrikmusters, die Familien verwandter Objekte auf flexible und wartbare Weise erstellt. Sie bietet eine abstrakte Schnittstelle für die Erstellung dieser Objektfamilien, während konkrete Implementierungen der Schnittstelle je nach Bedarf ein- und ausgetauscht werden können.

Ein konkretes Praxis-Beispiel:

In einem Beispiel für ein Weltraumszenario könnte eine konkrete Implementierung der abstrakten Fabrik darin bestehen, eine Fabrik zur Herstellung verschiedener Arten von Raumschiffen zu erstellen. In einem Java-Script Beispiel würde das wie folgt aussehen:

Wir können dann konkrete Implementierungen dieser Schnittstelle für jede Art von Raumfahrzeugen erstellen. Zum Beispiel könnte eine RocketFactory die Methode createRocket implementieren, um verschiedene Raketentypen zu erstellen:

In ähnlicher Weise könnte eine ShuttleFactory die Methode createShuttle implementieren, um verschiedene Arten von Shuttles zu erstellen:

Durch die das Erstellen konkreter Implementierungen der abstrakten Fabrikschnittstelle stellen wir sicher, dass jede Fabrik Objekte erzeugt, die zu einer bestimmten Familie oder Kategorie gehören.

Das ist ein ganz wichtiges Prinzip der Objektorientierung. Solche Softwarearchitektur-Konzepte fördern die Modularität des Codes und macht es viel einfacher, den diesen Sourcecode in Zukunft zu erweitern oder zu ändern.

Die konkrete Implementierung der Fabrik würde die spezifischen Klassen für jede dieser Komponenten definieren. Durch die Erstellung konkreter Implementierungen der abstrakten Fabrikschnittstelle können wir sicherstellen, dass jede Fabrik Objekte erzeugt, die zu einer bestimmten Familie oder Kategorie gehören. Dies fördert die Modularität des Codes und macht es einfacher, unseren Code in Zukunft zu erweitern oder zu ändern.

Produkt

Das Objekt, das von der Fabrik erstellt wird. Das Produkt kann eine Schnittstelle oder eine abstrakte Klasse sein, die die Eigenschaften und das Verhalten der Objekte definiert, die von der Fabrik erstellt werden.

Konkretes Produkt

Eine spezifische Implementierung des Produkts. Das konkrete Produkt wird von der konkreten Factory erstellt und ist das eigentliche Objekt, das der Client-Code verwenden wird.

Übertragen wir dies auf unser Code-Beispiel:

Dann gibt es mehrere konkrete Produkte wie Rocket, Shuttle und Satellite, die die SpaceVehicle-Schnittstelle mit spezifischen Implementierungen der Start- und Landemethoden realisieren:

Beim Factory Pattern erstellt der Client-Code nicht direkt Objekte. Stattdessen fordert er Objekte von der Fabrik an, indem er eine Methode der abstrakten Fabrik aufruft. Die Fabrik erstellt dann das entsprechende konkrete Produkt und gibt es an den Client zurück.

Welche Vorteile bieten Factory Pattern?

Einer der Hauptvorteile des Factory Patterns ist die einfache Erweiterbarkeit.

Neue Produkte können dem System hinzugefügt werden, indem einfach ein neues konkretes Produkt und eine entsprechende konkrete Fabrik erstellt werden.

Der bestehende Client-Code kann dann das neue Produkt ohne Änderung verwenden. Das macht den Code wesentlich wartbarer und flexibler.

Außerdem bietet dieses Softwaredesign eine Abstraktionsebene, die das Verständnis und die Änderung des Codes erleichtert, da die Erstellung von Objekten vom Client-Code, der sie verwendet, getrennt ist.

Liste von Vorteilen bei der Verwendung des Factory Patterns:

Kapselung

Das Factory Pattern kapselt den Prozess der Objekterzeugung und trennt ihn vom Rest des Codes. Dadurch wird der Code modularer und leichter zu pflegen.

Abstraktion

Das Factory Pattern bietet eine Abstraktionsschicht, die den Client-Code von den Details der Objekterstellung abschirmt. Dies macht den Code flexibler und einfacher zu ändern, da sich Änderungen an der Implementierung der Factory nicht auf den Client-Code auswirken.

Polymorphismus

Das Factory Pattern ermöglicht Polymorphismus, indem es Objekte auf der Grundlage einer gemeinsamen Schnittstelle oder abstrakten Klasse erzeugt. Das bedeutet, dass der Client-Code mit verschiedenen Arten von Objekten arbeiten kann, ohne deren spezifische Implementierungsdetails zu kennen.

Vereinfacht den Client-Code

Das Factory Pattern vereinfacht den Client-Code, indem es eine einzige Methode oder Schnittstelle für die Erstellung von Objekten bereitstellt. Dadurch entfällt die Notwendigkeit einer komplexen Objekterstellungslogik im Client-Code.

Verbessert die Testbarkeit

Das Factory Pattern verbessert die Testbarkeit, indem es die einfache Ersetzung konkreter Klassen durch Mock-Objekte ermöglicht. Dadurch wird es einfacher, den Client-Code isoliert vom Rest der Anwendung zu testen.

Trennung der Belange (Separation of concerns)

Das Factory Pattern trennt die Bereiche der Objekterstellung und der Objektverwendung. Dies fördert eine bessere Code-Organisation und Wartbarkeit.

Wiederverwendung von Code

Das Factory Pattern fördert die Wiederverwendung von Code, indem es die Erstellung einer Familie von verwandten Objekten ermöglicht, die ein gemeinsames Verhalten, aber unterschiedliche Implementierungen oder Konfigurationen haben.

Insgesamt bietet das Factory Pattern eine Reihe von Vorteilen, die unseren Code modularer, flexibler und wartungsfreundlicher machen.

Durch die Kapselung des Prozesses der Objekterstellung und die Bereitstellung einer Abstraktionsschicht können wir den Client-Code vereinfachen, die Testbarkeit verbessern und eine bessere Codeorganisation fördern.