Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Grundlagen der Programmierung: Entwurfsmuster

Fabrikmethode: Problem

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Um ein Objekt erzeugen zu können, muss dessen konkrete Klasse bekannt sein. Das kann zum Problem werden, wenn die Klasse kontextabhängig ausgewählt werden, der Kontext aber verborgen bleiben soll.
04:36

Transkript

In diesem Video erfahren Sie, was es mit der Fabrikmethode auf sich hat. Es geht dabei um folgende Problemstellung. Ein Client, der ein bestimmtes Objekt benötigt, soll von den Details der Erzeugung dieses Objektes entkoppelt werden. Er soll sich also insbesondere nicht darum kümmern müssen, welcher Konstruktor aufgerufen werden soll, mit welchen Parametern und ob das Objekt danach noch irgendwie initialisiert werden muss. Wenn mehrere ähnliche Klassen zu Instanziierung zur Auswahl stehen und es vom Kontext abhängt, welche davon verwendet werden soll, dann soll der Client diese Entscheidung nicht selbst treffen müssen, weil er zum Beispiel den Kontext gar nicht kennt oder die Auswirkung des Kontextes nicht kennt. Anwendungen dafür sind zum Beispiel, wenn wir ein Programm haben, das Dateien in verschiedenen Formaten einlesen können soll. Da könnte es für jedes Dateiformat ein entsprechendes Objekt geben, was sich genau mit diesem Format auskennt und weiß, wie man Dateien dieses Formates einzulesen hat. Ein anderer Teil dieses Programms, der nun einfach eine Datei eingelesen haben möchte, müssten ziemlich genau wissen, welches Objekt dafür zuständig ist, wie es erzeugt werden soll, wie es initialisiert wird und wie er damit arbeiten soll. Eine andere Situation, in der der Client die Objekte gar nicht selbst erzeugen soll, ist das Objekt-Pooling. Ein Objekt-Pool ist eine Sammlung gleichartiger Objekte, die schon fertig erzeugt und vorinitialisiert sind und bereit zur Verwendung. Das ist häufig eine gute Idee, wenn es um die zentrale Verwaltung knapper Ressourcen geht und wenn die Erzeugung der einzelnen Objekte recht aufwendig oder zeitintensiv ist. Ein typisches Beispiel dafür wäre ein Thread-Pool, ein anderes ein Connection-Pool, der zum Beispiel fertige benutzbare Verbindungen zu einer Datenbank enthält. Wenn ein Teil unserer Anwendung jetzt eine Verbindung zur Datenbank braucht, dann greift er einfach in diesen Pool hinein, holt sich eine Verbindung heraus, macht irgendwas mit der Datenbank und packt die Verbindung danach wieder in den Pool zurück und wenn wir für unterschiedliche Datenbanksysteme unterschiedliche Connection-Objekte brauchen, dann wäre es natürlich gut, wenn wir auch diese Unterschiede vor dem Client irgendwie verbergen könnten. Ein Extremfall des Objekt-Poolings liegt vor, wenn der Pool nur aus insgesamt einem Objekt bestehen soll. Die Größe des Pools ist also genau 1. Das wäre dann ein Singleton und in solchen Fällen möchten wir natürlich erst recht nicht, dass Clients die Objekte selbst erzeugen. Auch hier soll also die Erzeugung des Objekts vor dem Client verborgen werden. Allgemein stellt sich dieses Problem also folgendermaßen dar. Es gibt in unserer Anwendung verschiedene Klassen, die ähnliche Dienste anbieten und es gibt einen Client, der diese Dienste in Anspruch nehmen möchte. Abhängig von der aktuellen Situation, von Umgebungsparametern oder von irgendwelchen Bedingungen muss der Client nun entscheiden, welchen dieser Dienste er nutzen möchte. Das heißt, er muss alle diese Dienste kennen und er muss wissen unter welchen Bedingungen er welchen dieser Dienste auswählen soll. Das klingt jetzt vielleicht noch etwas theoretisch, deswegen schauen wir uns das in einem Quelltextbeispiel an. In diesem kleinen Beispiel habe ich hier einen Client, der möchte sich etwas zu essen bestellen. Dafür gibt es verschiedene Mahlzeiten. Es gibt Frühstück, Mittag und Abendbrot und abhängig von der Uhrzeit soll der Client das entsprechend Essen auswählen. Die Implementierung der einzelnen Mahlzeigen ist hier bewusst einfach gehalten, damit wir uns aufs Wesentliche konzentrieren können. Ich zeige Ihnen das Frühstück. In der Klasse gibt es eine ganze Methode, mit der wir uns die Beschreibung des Frühstücks holen können, in diesem Fall also Kaffee. Das ist also eine der Dienste, aus denen der Client auswählen soll. Der zweite ist dann das Mittagessen, ähnlich komplex, ebenfalls eine Beschreibung, in diesem Fall gibt es Eintopf mit Kaffee und zum Abendbrot gibt es Salat und Tee. Sollte der Client zu unüblichen Zeiten etwas essen wollen, haben wir auch dafür eine Lösung, nämlich KeinEssen. Hier bekommen wir, dass es um diese Zeit nichts gibt. In diesem Beispiel haben wir also vier verschiedene Dienste, aus denen der Client kontextabhängig einen auswählen soll und der Kontext ist in diesem Fall die aktuelle Uhrzeit. Der Client könnte also folgendermaßen aussehen. Zu Beginn holen wir uns die aktuelle Uhrzeit und extrahieren daraus die Stunde. Dann fragen wir uns, was gibt es denn jetzt und treffen diese Entscheidung dann abhängig von dieser Stunde. Also von 6 bis 11 gibt es Frühstück. Wir erzeugen uns also ein Frühstücksobjekt und fragen das dann nach seiner Beschreibung. Zwischen 11 und 16 gibt es dann entsprechend Mittagessen. Auch hier holen wir uns das passende Objekt bzw. korrekter, wir erzeugen es selbst und holen und die entsprechende Beschreibung. Von 16 bis 22 Uhr gibt es dann Abendbrot und zwischen 22 und 6 gibt es nichts zu essen. Ich denke, man kann hier recht deutlich sehen, dass der Client wissen muss, erstens welche Auswahlmöglichkeiten es überhaupt gibt und zweitens unter welchen Bedingungen welche dieser Auswahlmöglichkeiten zutrifft. Außerdem muss natürlich jeder Client, der quasi etwas zu essen haben möchte, diese Logik ebenfalls enthalten. Das würde dann sogar noch zu Codedopplungen führen und damit zu einer noch schlechteren Wartbarkeit dieses Systems. Ein Client, der sich um die Erzeugung der Objekte, die er benötigt, immer selbst kümmern muss, ist also nicht immer eine gute Idee.

Grundlagen der Programmierung: Entwurfsmuster

Erhalten Sie einen fundierten Einstieg in das Thema Entwurfsmuster (Design Patterns) und erfahren Sie, wie Sie Entwurfsmuster in objektorientierten Programmiersprechen umsetzen.

2 Std. 49 min (33 Videos)
Einfach klasse!
DHBW-Stuttgart
Super erklärt!
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!