Klassifizierung |
objektbasiertes Erzeugungsmuster
|
| |
Zweck |
Schnittstelle zum Erzeugen von Familien verwandter oder
voneinander abhängiger Objekte, ohne die Klassen direkt
zu benennen.
|
| |
Alias |
kit
abstract factory
|
| |
Motivation |
Anwendungen für verschiedene Fenstersysteme
|
| |
Beispiel |
public
interface WidgetFactory {
public
Window createWindow();
public
ScrollBar createScrollBar();
}
class QtWidgetFactory
implements WidgetFactory {
public
Window createWindow() {
return
new QtWindow();
}
public
ScrollBar createScrollBar() {
return
new QtScrollBar();
}
}
class GTKWidgetFactory
implements WidgetFactory {
public
Window createWindow() {
return
new GTKWindow();
}
public
ScrollBar createScrollBar() {
return
new GTKScrollBar();
}
}
abstract
class Window {
}
class QtWindow
extends Window {
}
class GTKWindow
extends Window {
}
abstract
class ScrollBar {
}
class QtScrollBar
extends ScrollBar {
}
class GTKScrollBar
extends ScrollBar {
}
|
| |
Anwendbarkeit |
|
|
Unabhängigkeit von der
Erzeugung, Zusammensetzung und Repräsentation
von Produkten
|
|
Konfigurierbarkeit von mehreren
Produktfamilien
|
|
Sicherung der Konsistenzbedingungen zwischen
den Produkten einer Familie
|
|
Klassenbibliotheken von Produkten,
aber nur die Schnittstelle ist öffentlich
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
AbstractFactory |
Abstrakte Schnittstelle für erzeugende Funktionen
|
Factory[1-2] |
Implementierungen der Schnittstelle
|
AbstractProduct[A-B] |
Schnittstellen für die verschiedenen Produkte
|
Product[A-B][1-2] |
konkrete Produkte: pro konkreter Fabrik und abstraktem Produkt
eine konkrete Klasse
|
Client |
verwendet nur die abstrakte Fabrik und die abstrakten Produkte
|
| |
Konsequenzen |
|
|
Isolierung der konkreten Klassen von der Anwendung
|
|
keine Konstruktoraufrufe in der Anwendung,
nur in der Fabrik
|
|
einfacher Austausch der Produktfamilien
|
|
dynamischer Austausch der Produktfamilien
|
|
Konsistenz unter den Produkten ist gewahrt
|
|
neue Produkte:
Erweiterung der Fabrik-Schnittstelle
Erweiterung aller Fabrik-Implementierungen
|
| |
Implementierung |
|
|
häufig:
nur ein Fabrikobjekt zur Laufzeit erzeugen
|
|
|
|
in Java: Dynamisches Laden einer Fabrik
|
|
Class factoryClass =
Class.forname("my.package.Factory");
AbstractFactory factory =
(AbstractFactory)(
factoryClass.newInstance());
|
| |
Bekannte Verwendungen |
JDK AWT Implementierungen für Windows, Mac und X
|
| |
verwandte Muster |
|
|
zur Erzeugung der Fabrik |
| |
|
zur Implementierung der Fabrik-Klassen |
| |