Was sind Erzeugungsmuster?
Erzeugungsmuster (auf Englisch: Creational Patterns) sind spezielle Design Patterns, die für die Erstellung/Erzeugung von Objekten eingesetzt werden. Es gibt mehrere Creational Patterns und jedes Pattern ist für eine spezifische Situation besser eingerichtet, obwohl alle Patterns den gleichen Zweck erreichen.
Die Standard Strategie für die Definition der Erstellung von Objekten ist zu simple und kann zu Design Problemen führen und kann sehr schnell den Entwickler überfördern. Creational Patterns helfen Komplexe Erstellungslogik zu vereinfachen und zu verallgemeinern.
Die bekannteste Creational Patterns:
- Abstract Factory
- Builder
- Factory Method
- Object Pool
- Prototype
- Singleton
Abstract Factory
Zweck
- Eine Schnittstelle für die Erstellung von Objektgruppen, die stark verkoppelt sind, ohne die konkreten Klassen zu spezifizieren, zu Verfügung stellen
- Eine Hierarchie von Objekten für möglichst viele Plattformen erstellen zu können
- Auf den «new» Operator, wenn möglich, zu verzichten
Problematik
Wenn eine Applikation für mehrere Plattformen entwickelt wird, muss sie verschiedene Ansätze für jede Plattform implementieren. Wenn keine gute Trennung dieser Logik eingeführt wird, fangt den Code an viele «#ifdef» Fälle zu haben. Wegen dieses Falls wird die Applikation sehr viel Code für jeder Plattformoption besitzen, was in der Zukunft sehr schwierig zu verhalten wird.
Struktur
Die Abstract Factory Pattern definiert einen Factory Methode pro Produkt. Jede Factory Methode verschliesst den «new» Operator und die konkreten plattformspezifischen Klassen. Jede Plattform besitzt ihre spezifische Factory.
Beispiel
Wir haben eine Applikation für Windows und Apple Geräte entwickelt, leider verhalten sich die GUIs der beiden Plattformen anders und wir müssen diese Unterschiede im Code einbegriffen. Dafür können wir eine Abstract Factory für die verschiedene UI Elemente, jeweils für Windows Betriebssysteme und OSX Betriebssysteme. Diese Factories können die einzelnen Elemente für ihren Betriebssystem erstellen und wir können diese erzeugen und beliebig einrichten.
Checkliste für die Einsetzung
- Entscheiden ob die Erstellung von plattformspezifischen Produkten scher zu verwalten wird
- Eine Matrix von Plattformen im Gegensatz zu Produkten erstellen
- Eine Factory Interface definieren, die aus einen Factory Method für jedem Produkt besteht.
- Eine Klasse für jede Plattform definieren, die die Factory Interface implementiert und alle Referenzen zu den «new» Operator abstrahiert.
- Den Client soll keine «new» Referenzen besitzen, sonst die Erzeugungsmethoden der Factories benutzen
- Schön, sauberes und strukturiertes Code geniessen 😊
Analogie & Zusammenfassung
Die Abstract Factory Pattern funktioniert wie den CEO von einer Fabrikkette und durch ihn können wir ein spezifisches Produkt von seiner, für diesem Arbeit besser eingerichtete Fabrik, erzeugen / erstellen lassen. Somit haben wir einen zentralen Punkt, den die Entscheidungen für die Erstellung des Produktes übernehmen kann. Dieser Strategie befreit uns von repetitivem Code, den immer für die Erstellung eines Objektes geschrieben werden muss.