Erzeugungsmuster

Abstrakte Fabrik (Abstract Factory)

*Zweck: Biete eine Schnittstelle zum Erzeugen von Familien verwandter oder voneinander abhängiger Objekte, ohne ihre konkreten Klassen zu bennen.
*Struktur: Abstrakte Fabrik
Abb. 1.1 Abstrakte Fabrik
*Teilnehmer:

  • AbstrakteFabrik
    • deklariert eine abstrakte Schnittstelle für Operationen, die konkrete Produktobjekte erzeugen.
  • KonkreteFabrik
    • implementiert die Operation zur Erzeugung konkreter Produktobjekte.
  • AbstraktesProdukt
    • deklariert eine Schittstelle für einen bestimmten Typ von Produktobjekten.
  • KonkretesProdukt
    • definiert ein von der entsprechenden konkreten Fabrik zu erzeugendes Produktobjekt.
    • implementiert die AbstraktesProdukt-Schnittstelle
  • Klient
    • verwendet nur die Schnittstellen, welche von den AbstrakteFabrik- und AbstraktesProdukt-Klassen deklariert werden.

*Anwendbarkeit: Verwenden sie das Abstrakte-Fabrik-Muster, wenn

  • ein System unabhängig davon sein soll, wie seine Produkte1 erzeugt, zusammengesetzt und repräsentiert werden.
  • ein System mit einer von mehreren Produktfamilien konfigureiert werden soll.
  • eine Familie von verwandten Produktobjekten entworfen wurde, zusammen verwendet zu werden, und Sie diese Konsistenzbedingung sicherstellen müssen.
  • Sie eine Klassenbibliothek von Produkten anbieten möchten, von denen Sie nur die Schnittstellen, nicht aber ihre Implementierungen offenlegen möchten.


Erbauer (Builder)

*Zweck: Trenne die Konstruktion eines komplexen Objekts von seiner Repräsentation, so dass derselbe Konstruktionsprozess unterschiedliche Repräsentationen erzeugen kann.
*Struktur: Erbauer
Abb 1.2 Erbauer
*Teilnehmer:

  • Erbauer
    • spezifiziert eine abstrakte Schnittstelle zum Erzeugen von Teilen eines Produktobjekts.
  • KonkreterErbauer
    • konstruiert und fügt Teile des Produkts zusammen, indem es die Erbauerschnittstelle implementiert.
    • definiert und verwaltet die von ihm erzeugte Repräsentation.
    • bietet eine Schnittstelle zum Zurückgeben des Produkts.
  • Direktor
    • konstruiert ein Objekt unter Verwendung der Erbauerschnittstelle.
  • Produkt
    • repräsentiert das gerade konstruierte komplexe Objekt. Ein KonkreterErbauer erstellt die interne Repräsentation des Produkts und definiert den Prozess, durch den es zusammengesetzt wird.
    • schließt Klassen ein, welche die konstituierenden Teile definieren. Dies umfasst die Schnittstellen, mit denen die Teile zum endgültigen Resultat zusammengefügt werden.

*Anwendbarkeit: Verwenden Sie das Erbauermuster in folgenden Situationen:

  • Der Algorithmus zum Erzeugen eines komplexen Objekts soll unabhängig von den Teilen sein, aus denen das Objekt besteht und wie sie zusammengesetzt werden.
  • Der Konstruktionsprozess muss verschiedene Repräsentationen des zu konstruierenden Objekts erlauben.


Fabrikmethode (Factory Method)

*Zweck: Definiere eine Klassenschnittstelle mit Operationen zum Erzeugen eines Objekts, aber lasse Unterklassen entscheiden, von welcher Klasse das zu erzeugende Objekt ist. Fabrikmethoden ermöglichen es einer Klasse, die Erzeugung von Objekten an Unterklassen zu delegieren.
*Struktur: Fabrikmethode
Abb 1.3 Fabrikmethode
*Teilnehmer:

  • Produkt
    • definiert die Klasse des von der Fabrikmethode erzeugten Objekts.
  • KonkretesProdukt
    • implementiert die Produktschnittstelle.
  • Erzeuger
    • deklariert die Fabrikmethode, die ein Objekt des Typs Produkt zurückgibt. Der Erzeuger kann möglicherweise eine Defaultimplementierung der Fabrikmethode definieren, die ein vordefiniertes KonkretesObjekt erzeugt.
    • kann die Fabrikmethode aufrufen, um ein Produktobjekt zu erzeugen.
  • KonkreterErzeuger
    • überschreibt die Fabrikmethode, so dass sie ein Exemplar von KonkretesProdukt zurückgibt.

*Anwendbarkeit: Verwenden Sie das Fabrikmethodenmuster, wenn

  • eine Klasse die Klassen von Objekten, die sie erzeugen muss, nicht im voraus kennen kann.
  • eine Klasse möchte, dass ihre Unterklassen die von ihr zu erzeugenden Objekte festlegen.
  • Klassen Zuständigkeiten an eine von mehreren Hilfsunterklassen delgieren sollen und Sie das Wissen lokalisieren wollen, an welche Hilfsunterklassen die Zuständigkeiten delgiert werden.


Prototyp (Prototype)

*Zweck: Bestimme die Arten zu erzeugender Objekte durch die Verwendung eines prototypischen Exemplars und erzeuge neue Objekte durch Kopieren dieses Prototypen.
*Struktur: Prototyp
Abb 1.4 Prototyp
*Teilnehmer:

  • Prototyp
    • deklariert eine Schnittstelle, um sich selbst zu klonen.
  • KonkretesProdukt
    • implementiert eine Operation, um sich selbst zu klonen.
  • Klient
    • erzeugt ein neues Objekt, indem es einem Prototyp befiehlt, sich selbst zu klonen.

*Anwendbarkeit: Verwenden Sie das Prototypmuster, wenn ein System unabhängig davon sein soll, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden, und

  • wenn die Klassen zu erzeugender Objekte erst zur Laufzeit spezifiziert werden, beispielsweise durch dynamisches Laden, oder
  • um zu vermeiden, eine Klassenhierarchie von Fabriken zu erstellen, die parallel zur Klassenhierarchie der Produkte verläuft, oder
  • wenn Exemplare einer Klasse nur wenige unterschiedliche Zustandskombinationen haben können. Es ist möglicherweise bequemer, eine entsprechende Anzahl von Prototypen einzurichten und sie zu klonen statt die Objekte einer Klasse jedesmal von Hand mit dem richtigen Zustand zu erzeugen.


Singleton (Singleton)

*Zweck: Sichere ab, dass eine Klasse genau ein Exemplar besitzt, und stelle einen globalen Zugriffspunkt darauf bereit.
*Struktur: Singleton
Abb 1.5 Singleton
*Teilnehmer:

  • Singleton
    • definiert eine Exemplaroperation, die es Klienten ermöglicht, auf sein einziges Exemplar zuzugreifen. Exemplar ist ein Klassenoperation, also eine Klassenmethode in Smalltalk und eine statische Member-Funktion in C++.
    • ist potentiell für die Erzeugung seines einzigen Exemplars zuständig.

*Anwendbarkeit: Verwenden Sie das Singletonmuster, wenn

  • es genau ein Exemplar einer Klasse geben und es für Klienten an einem wohldefinierten Punkt zugreifbar sein muss.
  • das einzige Exemplar durch Bildung von Unterklassen erweiterbar sein soll und Klienten in der Lage sein sollen, das erweiterte Exemplar ohne Modifikation ihres Codes verwenden zu können.

Summarized by: Dipl.-Ing. (UNI) Dipl.-Ing. (FH) Ralf Isken
Only for private use.
Source: Entwurfsmuster; Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides; Addison-Wesley; 1996


Anmerkung

1 Unter "Produkten" sind hier die vom System erzeugten Objekte zu verstehen. (zurück)