Klassifizierung |
klassenbasiertes Erzeugungsmuster
|
| |
Zweck |
Definition einer Schnittstelle mit Operationen zum Erzeugen eines
Objekts
Konstruktoren virtuell machen
|
| |
Alias |
factory method
virtueller Konstruktor
|
| |
Motivation |
Anwendung bestimmt, wann ein Objekt erzeugt werden soll
|
|
Anwendung arbeitet aber nur mit abstrakten Klassen,
darf also die konkrete Ausprägung des zu erzeugenden Objekts nicht kennen.
|
|
Konstruktor soll vor der Anwendung versteckt werden
|
| |
Beispiel |
Anwendung <--> Dokument
|
| |
Anwendbarkeit |
|
|
konkrete Klasse der zu erzeugenden Objekte soll
vor dem Anwender verborgen bleiben
|
|
Erzeugung soll an Unterklassen delegiert werden
|
|
eine konkrete Klasse soll entscheiden, wie das Produkt
zu erzeugen ist
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
Produkt |
abstrakt
Schnittstelle des erzeugten Produkts
|
KonkretesProdukt |
konkret
konkrete Klasse des erzeugten Produkts
|
Erzeuger |
abstrakt
definiert Schnittstelle für die Fabrikmethode
kann default-Implementierung festlegen
kann Methoden zum Erzeugen aufrufen
|
KonkreterErzeuger |
konkret
realisiert oder überschreibt die Fabrikmethode so,
dass ein konkretes Produkt zurückgegeben wird
|
| |
Konsequenzen |
|
|
frameworks
vorgefertigte Mustersysteme, Umgebungen können
angepasst und erweitert werden
|
|
|
|
z.B. ein beliebiger Editor mit menubar, toolbar, Dokumentenfenster,
... fertig
|
|
meine Anwendung bestimmt, was in die Inhaltsfenster kommt
|
| |
Implementierung |
|
|
Variante: parametrisierte Fabrikmethoden
über Parameter wird der Erzeugungsprozess gesteuert und die Auswahl
der Produkte vorgenommen
|
|
|
|
Erzeuger und Produkt zwei verschiedene Klassen,
damit der Erzeuger verändert werden kann.
|
| |
Beispiel |
|
| |
Vereinfachte Variante |
|
|
wenn die Flexibilität nicht
erforderlich ist, die konkreten Unterklassen einer
Hierarchie aber vor dem Klienten versteckt werden soll,
können Erzeuger und Produkt zusammengefasst werden.
|
Beispiel |
|
| |
|
Erweiterbarkeit um eigene Klassen nicht möglich,
ohne die Erzeuger-Klasse zu ändern
und deren Schnittstelle zu erweitern.
|
| |
|
die Konstruktoraufrufe der Produktklassen stehen
nicht in dem Klientencode,
sondern sind in der Erzeuger-Klasse
gebündelt
|
| |
Bekannte Verwendungen |
in vielen Klassenbibliotheken
|
| |
verwandte Muster |
|
|
|
| |
|
ruft Fabrikmethoden auf |
| |
|
benötigt keine Unterklassen |
| |