Definition:
Die abstrakte Fabrik bietet eine Schnittstelle zum Erzeugen verwandter Objekte. Programme, die auf die Konstruktion des Musters zugreifen, verwenden die Schnittstellen, die von den Oberklassen konkreter Produkte definiert wurden.
AbstractFactory ist die Oberklasse aller Fabriken (ConcreteFactory1, ConcreteFactory2) die Produkte erzeugen können. Eine konkrete Fabrik implementiert die Methoden, die Produkte erzeugen. Produkte (z.B. ConcreteProductA1), die gleiche oder ähnliche Eigenschaften haben, besitzen dieselbe Oberklasse.
Beispiel
Als Beispiel für die Anwendung des Abstract Factory-Entwurfsmusters entstand das Programm Fensterfamilien in Sprachvarianten. Je nach Notwendigkeit können Fenster unterschiedlicher Sprachen (hier: Englisch und Deutsch) und verschiedenen Aussehens (Label, Button und ggf. ein Textfeld) erzeugt und angezeigt werden. Da die Oberklassen lediglich die Methoden definieren wurden, bis auf ExampleFrameFactory, statt abstrakter Klassen Interfaces verwendet.
ExampleFrame1 legt fest, welche Methoden konkrete Fensterklassen zu implementieren haben. Es sollen Eigenschaften definiert werden, die durch get()-Methoden von anderen Klassen abgerufen werden können.
public interface ExampleFrame1 {
public String getLabelText();
public String getButtonText();
}
Der Text eines darzustellenden Labels, sowie der eines Buttons, werden bei Unterklassen von ExampleFrame1 benötigt. GermanExampleFrame1 (ConcreteProductB1) ist ein Unterklasse von ExampleFrame1.
public class GermanExampleFrame1
implements ExampleFrame1 {
public String getLabelText() {
return ("Dies ist ein deutschsprachiges Label.");
}
public String getButtonText() {
return ("Beenden");
}
}
EnglishExampleFrame1 erbt von ExampleFrame1 und legt die Eigenschaften für ein englischsprachiges Fenster fest. ExampleFrame2 besitzt zusätzlich zu ExampleFrame1 eine Methode, die einen Text liefert, der in einem Textfeld dargestellt werden kann. GermanExampleFrame2 ist eine Unterklasse von ExampleFrame2.
public class GermanExampleFrame2 implements ExampleFrame2 {
...
public String getText() {
return (``Standard-Text``);
}
}
EnglishExampleFrame2 erbt von ExampleFrame2. ExampleFrameFactory ist eine abstrakte Klasse, von der alle Fabrikklassen abgeleitet werden.
public abstract class ExampleFrameFactory {
public abstract ExampleFrame1 createExampleFrame1();
public abstract ExampleFrame2 createExampleFrame2();
...
private static final ExampleFrameFactory englishFactory = new EnglishFactory();
private static final ExampleFrameFactory germanFactory = new GermanFactory();
public static ExampleFrameFactory getFactory(int language) {
...
}
}
Die abstrakten Methoden werden von den beiden Unterklassen GermanFactory und EnglishFactory überschrieben. Instanzen der beiden konkreten Fabrikklassen (englishFactory und germanFactory) werden über die getFactory()-Methode an anfragende Klassen weitergegeben. GermanFactory erzeugt Exemplare von GermanExampleFrame1 und GermanExampleFrame2.
public class GermanFactory extends ExampleFrameFactory {
public ExampleFrame1 createExampleFrame1() {
return new GermanExampleFrame1();
}
public ExampleFrame2 createExampleFrame2() {
return new GermanExampleFrame2();
}
}
EnglishFactory erzeugt Exemplare von EnglishExampleFrame1 und EnglishExampleFrame2. LanguageFactory greift auf die Konstruktion der AbstractFactory zu.
public class LanguageFactory extends JFrame {
public void getUIExampleFrame1 (ExampleFrame1 ef1) {
...
contentPane.add(new JLabel(
ef1.getLabelText()));
...
}
public void getUIExampleFrame2 (ExampleFrame2 ef2) {
...
}
...
public static void main (String[] args) {
LanguageFactory lf = new LanguageFactory();
ExampleFrameFactory eff1 = ExampleFrameFactory.getFactory(ExampleFrameFactory.ENGLISH);
ExampleFrameFactory eff2 = ExampleFrameFactory.getFactory(ExampleFrameFactory.GERMAN);
Random random = new Random();
int choice = random.nextInt(4);
...
switch (choice) {
case 0:
ExampleFrame1 ef1English = eff1.createExampleFrame1();
lf.getUIExampleFrame1(ef1English);
break;
case 1:
ExampleFrame2 ef2English =
eff1.createExampleFrame2();
lf.getUIExampleFrame2(ef2English);
break;
...
}
}
}
LanguageFactory benutzt Instanzen der Klassen GermanFactory und EnglishFactory, die in den Variablen eff1 und eff2 gehalten werden. Per Zufall wird entschieden, welches Produkt erzeugt wird. In den Methoden getUIExampleFrame1() und getUIExampleFrame2() wird die Oberfläche des darzustellenden Fensters gestaltet. Mittels der in den Produkten implementierten Methoden werden die Texte des darzustellenden Labels, des Buttons und ggf. des Textfeldes festgelegt.
Technorati Tags: Abstrakte Fabrik Design Pattern
