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  | 
  |  |