- 1. Die Gründe
- 2. Probleme
- 3. Diskussion
- 4. Struktur
- 5. Beispiel
- 6. Kontrollliste
- 7. Faustregeln
Die Gründe
- Bereitstellen einer Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne ihre spezifischen Klassen anzugeben.
- Hierarchie, die einschließt: viele mögliche "Plattformen" und Aufbau einer Reihe von "Produkten".
- Der neue Operator gilt als schädlich.
Probleme
Wenn eine Anwendung portabel sein soll, muss sie alle Abhängigkeiten der Zielplattform kapseln. Diese "Plattformen" können umfassen: Fenstersystem, Betriebssystem, Datenbank usw. Allzu oft wird diese Kapselung nicht im Voraus entworfen, und viele case -Anweisungen oder verschiedene #ifdef mit Optionen für alle derzeit unterstützten Plattformen fangen an, sich wie Kaninchen im gesamten Code zu vermehren.
Diskussion
Bereitstellen einer Abstraktionsschicht, die die Erstellung von Familien verwandter oder abhängiger Objekte abstrahiert, ohne ihre konkreten Klassen explizit anzugeben. Das Factory-Objekt ist für die Bereitstellung von Diensten zum Erstellen der gesamten Klassenfamilie auf allen unterstützten Plattformen verantwortlich. Clients erstellen Plattformobjekte niemals direkt, sie bitten die Factory, dies für sie zu tun.
Dieser Mechanismus macht es einfach, die Familie der abgeleiteten Klassenobjekte zu ändern, da eine bestimmte Factory-Objektklasse nur einmal in der Anwendung erscheint, wo sie erstellt wird. Eine Anwendung kann die Möglichkeit bieten, eine ganze Familie abgeleiteter Objekte zu modifizieren, indem sie einfach eine andere spezifische Instanz der abstrakten Fabrik instanziiert.
Da der vom Factory-Objekt bereitgestellte Dienst so verbreitet ist, wird er normalerweise als Singleton implementiert. Oder es kann im Fall der Programmiersprache C++ unter Verwendung statischer Klassenmethoden implementiert werden.
Struktur
Eine abstrakte Factory definiert eine Factory-Methode für jedes generierte Objekt. Jede Factory-Methode kapselt den neuen Operator und konkrete, plattformspezifische Klassen. Jede "Plattform" wird dann durch eine abgeleitete Factory-Klasse modelliert.
Beispiel
Der Zweck von Abstract Factory besteht darin, eine Schnittstelle zum Erstellen von Familien verwandter Objekte bereitzustellen, ohne konkrete Klassen anzugeben. Dieses Modell ist in Blechstanzanlagen zu finden, die bei der Herstellung von Automobilen verwendet werden. Stanzausrüstung ist eine abstrakte Fabrik, die Autoteile herstellt. Derselbe Mechanismus wird verwendet, um rechte Seitentüren, linke Türen, rechte vordere Kotflügel, linke vordere Kotflügel, Motorhauben usw. für verschiedene Automodelle zu stanzen. Durch die Verwendung von Rollen zum Wechseln der Prägemuster können die von der Maschine produzierten spezifischen Qualitäten innerhalb von Minuten geändert werden.
Kontrollliste
- Entscheiden Sie, ob "Plattformunabhängigkeit" und Autorendienste Probleme in Ihrem Code verursachen.
- Leiten Sie eine Matrix von „Plattformen“ und „Produkten“ ab. Für welche Plattform, welche Klassen werden benötigt.
- Definieren Sie eine Factory-Schnittstelle, die aus einer Factory-Methode für jedes hervorgebrachte Objekt besteht.
- Definieren Sie für jede Plattform eine Produktionsklasse, die alle Verweise auf den neuen Operator kapselt.
- Der Client muss alle Verweise auf new entfernen und Factory-Methoden verwenden, um untergeordnete Objekte zu erstellen.
Faustregeln
- Manchmal konkurrieren übergeordnete Templates: Es gibt Zeiten, in denen entweder das Prototype-Template oder das Abstract Factory-Template erfolgreich verwendet werden können. Ansonsten ergänzen sie sich gegenseitig: Eine Abstract Factory kann eine Reihe von Prototypen speichern, aus denen Objekte geklont und zurückgegeben werden können. Der Builder kann eine der anderen Vorlagen verwenden, um die zu erstellenden Komponenten zu implementieren. Abstract Factory, Builder und Prototype können Singleton in ihrer Implementierung verwenden.
- Abstract Factory, Builder und Prototype definieren ein Factory-Objekt, das für die Erstellung einer Klasse von generierten Objekten verantwortlich ist, und machen es zu einem Systemparameter. Eine abstrakte Factory hat ein Factory-Objekt oder eine Methode, die Objekte mehrerer Klassen erzeugt. Der Erbauer hat ein Fabrikobjekt, das ein komplexes Produkt inkrementell unter Verwendung eines geeigneten komplexen Protokolls aufbaut. Ein Prototyp hat ein Fabrikobjekt (auch bekannt als Prototyp), das ein Produkt erstellt, indem es das Prototypobjekt kopiert.
- Abstrakte Factory-Klassen werden oft mit Factory-Methoden implementiert, sie können aber auch mit Prototype implementiert werden.
- Abstract Factory kann als Alternative zu Facade verwendet werden, um plattformspezifische Klassen auszublenden.
- Builder konzentriert sich darauf, ein komplexes Objekt Schritt für Schritt zu erstellen. Die abstrakte Fabrik betont eine Familie von Produktobjekten (einfach oder komplex). Der Builder gibt das Produkt als letzten Schritt zurück, aber was die abstrakte Fabrik betrifft, kehrt das Produkt sofort zurück.
- Oft beginnen Projekte mit der Factory-Methode (weniger komplex, anpassbar, Unterklassen nehmen zu) und entwickeln sich in Richtung Abstract Factory, Prototype oder Builder (flexibler, komplexer), wenn der Entwickler feststellt, dass beim Erstellen eines Objekts mehr Flexibilität erforderlich ist.