Factory-Method-Pattern
Oft ist es wünschenswert, dass Nutzer nicht direkt Objekte von bestimmten Klassen anlegen (können). Hier kann eine "Fabrik-Methode" (Factory-Method) helfen, der man die gewünschten Parameter übergibt und die daraus dann das passende Objekt (der richtigen Klasse) erzeugt und zurückliefert.
Dadurch erreicht man eine höhere Entkoppelung, die Nutzer müssen nur noch das Interface oder die abstrakte Klasse, also den Obertyp des Ergebnisses kennen. Außerdem lassen sich so leicht die konkreten Klassen austauschen.
Dieses Entwurfsmuster kommt häufig zusammen mit dem Singleton-Pattern vor, wo es nur eine einzige Instanz einer Klasse geben soll. Über eine Fabrik-Methode kann man diese Instanz ggf. erzeugen und dann die Referenz darauf zurückliefern.
- (K3) Entwurfsmuster Factory-Methode anwenden
Motivation: Ticket-App
-
Nutzer geben Fahrtziel an (und nicht die Ticketart!)
-
Ticket-App bucht passendes Ticket
- User muss nicht die konkreten Ticketarten kennen
- Ticketarten lassen sich leicht austauschen
=> Factory-Method-Pattern: Objekte sollen nicht direkt durch den Nutzer erzeugt werden
Factory-Method-Pattern
Hands-On: Ticket-App
Implementieren Sie eine Ticket-App, die verschiedene Tickets mit Hilfe des Factory-Method Entwurfsmusters generiert.
Wrap-Up
-
Konkrete Objekte sollen nicht direkt über Konstruktor erzeugt werden
-
(Statische) Hilfsmethode, die aus Parameter das "richtige" Objekte erzeugt
-
Vorteil:
- Nutzer kennt nur das Interface
- Konkrete Klassen lassen sich leicht austauschen
Ein Kunde kommt in unser Computergeschäft und möchte bei uns einen Computer bestellen. Dabei gibt er an, wie er diesen vorwiegend nutzen möchte bzw. für welchen Zweck er gedacht ist ("stationär" oder "mobil"). Nach reichlicher Überlegung, ob er den neuen Rechner zu Hause stehen haben möchte oder lieber keinen weiteren Rechner, egal ob "mobil" oder "stationär", bei sich im Weg herumstehen haben will, teilt er Ihnen seine Entscheidung darüber mit ("stationär" oder "mobil" vs. "nicht daheim"). Bei diesem Gespräch merkt er beiläufig an, dass es ein Rechner mit "viel Wumms" sein könnte oder vielleicht doch besser etwas Kleines, was leise vor sich hin schnurrt ("viel Wumms" vs. "leise schnurrend").
Je nach gewünschter Konfiguration soll ein den oben genannten Auswahlkriterien
entsprechender Rechner mit den aus der unten stehenden Konfigurationsmatrix zu
entnehmenden Eigenschaften automatisch erzeugt werden. Die Größe des installierten
RAM
, die Anzahl der eingebauten CPU
-Kerne mit ihrer jeweiligen Taktrate,
sowie die Art und Größe der installierten Festplatte (HDD
oder SSD
) sollte
dabei zu dem gewählten Paket passend gesetzt werden.
Implementieren Sie eine "Computerfabrik" (Klasse ComputerFactory
), die Ihnen
den richtig konfigurierten Rechner zusammenbaut. Nutzen Sie dabei das
"Factory-Method-Pattern" zum Erzeugen der Objekte der einzelnen Subklassen. Dabei
soll Ihre Computerfabrik anhand der ihr übergebenen Konfiguration eigenständig
entscheiden, welche Art von Computer dabei erstellt werden soll.
Implementieren Sie dazu in Ihrer Factory die Factory-Methode buildComputer
,
welche das jeweils passend konfigurierte Objekt zurückgibt.
public class ComputerFactory {
...
public static Computer buildComputer(..."stationär",..."viel Wumms") {
...
return myComputer;
}
}
Konfigurationsmatrix
"stationär" (DesktopComputer ) |
"mobil" (LaptopComputer ) |
"nicht daheim" (CloudComputer ) |
|
---|---|---|---|
"leise schnurrend" | 8 Cores, 1.21GHZ, 16GB RAM, 256GB HDD | 4 Cores, 1.21GHZ, 8GB RAM, 256GB HDD | 8 Cores, 1.21GHZ, 24GB RAM, 1000GB HDD |
"viel Wumms" | 16 Cores, 4.2GHZ, 32GB RAM, 2000GB SSD | 8 Cores, 2.4GHZ, 16GB RAM, 256GB SSD | 42 Cores, 9.001GHZ, 128GB RAM, 10000GB SSD |
- [Eilebrecht2013] Patterns kompakt
Eilebrecht, K. und Starke, G., Springer, 2013. ISBN 978-3-6423-4718-4. - [Gamma2011] Design Patterns
Gamma, E. und Helm, R. und Johnson, R. E. und Vlissides, J., Addison-Wesley, 2011. ISBN 978-0-2016-3361-0. - [Kleuker2018] Grundkurs Software-Engineering mit UML
Kleuker, S., Springer Vieweg, 2018. ISBN 978-3-658-19969-2. DOI 10.1007/978-3-658-19969-2.