Grundlagen der Programmierung: Entwurfsmuster

Fabrikmethode: Lösung

Testen Sie unsere 2005 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Fabrikmethode erlaubt es, die Objekterzeugung auszulagern. Wie das konkret funktioniert, sehen Sie in diesem Video.
06:13

Transkript

Ein Client, der die Auswahl zwischen verschiedenen ähnlichen Diensten hat und die Entscheidung darüber, wann er welchen verwenden soll, selber treffen muss, kann recht schnell recht komplex werden. Wir sehen das hier an diesem Client, der abhängig von der Tageszeit entscheiden möchte, welche Art von Mahlzeit er zu sich nimmt. Er muss dazu erst wissen, welche Arten von Mahlzeiten es überhaupt gibt, in diesem Fall also Frühstück, Mittag, Abendbrot und nachts gibt es nichts zu essen und er muss auch den Algorithmus kennen, nachdem die Auswahl getroffen wird. Hinzu kommt noch, dass wir beim Hinzufügen von weiteren Arten von Mahlzeiten, also zum Beispiel Brunch oder auch Blinner den Client ebenfalls anpassen müssten. Wenn wir sogar mehrere Clients haben, dann müssten wir die natürlich alle anpassen. Was hat nun das Entwurfsmuster Fabrikmethode zu bieten, das uns diese Situation vereinfachen könnte? Wenn wir genau hinschauen, können wir den Ansatz eigentlich hier sogar schon sehen. Der Client erzeugt sich zwar Instanzen völlig unterschiedlicher Klassen, also Fruehstueck, Mittag usw., kommuniziert danach mit diesen Instanzen aber auf immer dieselbe Weise. In unserem einfachen Beispiel, also indem er getBeschreibung aufruft. Wie legen wir das fest, dass verschiedene Objekte dieselben Methoden anbieten sollen? Genau. Wir führen eine Schnittstelle ein und das sieht dann so aus. In dieser Schnittstelle definieren wir nun, welche Methoden alle diese Dienste anbieten sollen. Auf diese Weise können Sie weiterhin komplett unterschiedlich und auch unabhängig voneinander bleiben, aber der Client hat jetzt eine einheitliche Schnittstelle, über die er zugreifen kann. Allerdings haben wir das Problem eigentlich noch nicht wirklich gelöst. Dieselben Methoden aufrufen, konnte der Client vorher schon. Die Auswahl, mit welchem Objekt er unter welchen Bedingungen kommunizieren möchte, muss er immer noch selbst treffen. Wenn wir dem Client diese Entscheidung jetzt abnehmen möchten, dann heißt das also, dass wir diesen Entscheidungsalgorithmus irgendwie aus dem Client herauslösen müssen und in anderes Objekt hineinpacken. Dieses andere Objekt nennen wir Fabrik. Warum Fabrik? Die Fabrik erzeugt uns Objekte nach unseren Vorgaben. Die Fabrik kennt nun alle vier Klassen, also alle Dienste und die Fabrik kennt auch die Schnittstelle, die alle diese Dienste anbieten. Außerdem enthält die Fabrik natürlich jetzt all das nötige Wissen, um jeden Client unter den gegebenen Bedingungen das passende Objekt ausliefern zu können. Nun muss sich der Client also um die Objekterzeugung nicht mehr selbst kümmern, sondern er geht stattdessen zur Fabrik und sagt, gib mal. Die Fabrik wählt nun nach sorgfältiger Prüfung der Umstände die passende Klasse aus und gibt eine Instanz an den Client zurück. Der Client muss nun gar nicht wissen Instanz, welcher Klasse dieses Objekt ist. Alles, was er wissen muss, ist, dass dieses Objekt alle, in der Schnittstelle definierten Methoden, anbietet und dass er die demzufolge aufrufen kann. Übertragen wird das auf unser Beispiel mit den verschiedenen Mahlzeiten. Bisher gab es die Klassen Fruehstueck, Mittag und Abendbrot jeweils mit der Methode getBeschreibung. Hier ist das Frühstück. Hier ist das Mittag. Hier ist das Abendbrot. Nachts gibt es nichts, dafür ist die Klasse KeinEssen da. Nun Auftritt Fabrikmethode. Ich schließe das hier und gehe zum Fabrikmethodenbereich. Zuerst schauen wir uns die Schnittstelle an. Die ist hier und die heißt Essen. Hier wird die eine Methode definiert, nämlich getBeschreibung. Im zweiten Schritt werden nun die vier verschiedenen Mahlzeiten entsprechend angepasst, dass sie dieses Interface implementieren also Fruehstueck implements Essen. Da die Methode zufällig im Fruehstueck vorher auch schon ändert sich in der Klasse selbst eigentlich nichts weiter. Das Gleiche gilt auch für die anderen Mahlzeiten. Mittag bietet jetzt also auch die Schnittstelle Essen an. Abendbrot ebenfalls und KeinEssen sowieso. Jetzt kommt die eigentliche Änderung, nämlich die Fabrikmethode. Also die Methode, die die Objekte erzeugt. Diese befindet sich in einer separaten Klasse und die habe ich hier Kantine genannt. In dieser Kantine gibt es nun eine statische Methode, die heißt getEssen und die liefert ein Essen zurück. Beachten Sie, dass das hier der Schnittstelletyp ist. Dadurch muss der Client tatsächlich auch nur noch die Schnittstelle kennen und nicht mehr die einzelnen implementierenden Klassen. Die Entscheidungslogik, die sich vorher im Client befand, liegt nun in dieser Methode. Am Algorithmus selbst hat sich nichts geändert. Das heißt, wir holen uns die aktuelle Stunde und dann entscheiden wir, gibt es Fruestueck, gibt es Mittag, gibt es Abendbrot oder gibt es nichts. Das entsprechende Objekt wird hier erzeugt in dieser Methode und wird an den Client zurückgegeben. Das führt jetzt natürlich zu einer signifikanten Vereinfachung des Client-Codes. Der sieht so aus. Der Client muss nun also nur noch zur Kantine gehen und sagen, gib Essen oder etwas formaler formuliert. Er ruft die Fabrikmethode auf getEssen, die die Details der Objekterzeugung kapselt und dem Client kontextabhängig das richtige Objekt zurückliefert. Der Client muss nichts über die implementierenden Klassen wissen. Alles, was er kennen muss, ist die Schnittstelle, die sie anbieten. Jetzt kann sich der Client erwartungsvoll fragen, was gibt es. Nimmt sein Essen. Ruft die Methode auf, die in der Schnittstelle beschrieben ist und bekommt dann die entsprechende Antwort. Ich führe das mal aus. Es ist jetzt kurz nach 16 Uhr. Das heißt Zeit für Abendbrot und tatsächlich wir bekommen Salat und Tee, also das mit dem Abendbrot hat funktioniert. Diese Vereinfachung trifft jetzt natürlich nicht nur für diesen Client zu sondern auch für alle anderen Clients, die es eventuell in unserer Anwendung geben könnte. Wir vermeiden also auch das Problem der Codedopplungen. Sollten nun weitere Arten von Mahlzeiten hinzugefügt werden oder es gibt Änderungen am Algorithmus nach dem entschieden wird, wann es welche Mahlzeit gibt, dann ist der Client davon völlig unbeeindruckt. Denn um all das kümmert sich unsere Fabrikmethode. Fassen wir die Vorteile nochmal zusammen. Der Client muss nicht wissen, wie die Objekte erzeugt werden, die er benötigt. Ob umfangreiche Initialisierungen notwendig sind, ob dafür vielleicht sogar weitere Dienste konsultiert werden müssen. All das ist dem Client ziemlich egal. Stehen verschiedene gleichartige Dienste zur Auswahl, dann muss der Client nicht wissen, wie diese Auswahl getroffen wird und das heißt dann auch, dass er nicht wissen muss, von welchem Typ das Objekt nun eigentlich ist, das er da bekommen hat. Das wird erreicht, indem alle Dienste eine gemeinsame Schnittstelle anbieten und schließlich besteht sogar die Möglichkeit, dass die Fabrikmethode das Objekt nochmal überprüft, bevor es ausgeliefert wird. Dadurch lässt sich sogar vermeiden, dass der Client irgendwelche unvollständigen oder inkonsistenten Objekte bekommt. Nachteile gibt es eigentlich fast keine. Zugegeben wir haben etwas mehr Quelltext und eine höhere Komplexität unsere Anwendung ist zumindest theoretisch möglich. Das hängt natürlich immer von der konkreten Situation ab und von dem konkreten Problem, das Sie versuchen zu lösen. Aber wenn für Sie die Vorteile überwiegen, dann sollten Sie einen Einsatz dieses Entwurfsmusters durchaus in Betracht ziehen.

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)
Derzeit sind keine Feedbacks vorhanden...
 

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!