Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Analyse und Modellierung von Informationssystemen Dr. Klaus Höppner Hochschule Darmstadt – Sommersemester 2013 1 / 20 Übersicht: Erzeugungsmuster Strukturmuster Übersicht: Erzeugungsmuster Strukturmuster 2 / 20 Übersicht: Erzeugungsmuster Strukturmuster Diagramm: Abstrakte Fabrik Handout S. 1 3 / 20 Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Wesentliche Eigenschaften Die abstrakte Fabrik definiert ein oder mehrere Produkt-Interfaces, die bestimmte Operationen deklarieren. Weiterhin wird ein Fabrik-Interface definiert, das über Fabrikmethoden die Funktionalität zum Erzeugen von Objekten definiert, die die Produkt-Interfaces implementieren. Im Diagramm sind dies die Produkt-Interfaces A und B, wobei ersteres von konkreten Klassen A1 und A2 und letzteres von B1 und B2 implementiert werden. Das Erzeugen der konkreten Objekte wird dabei vor der Anwendungslogik (weitestgehend) verborgen, indem der Konstruktoraufruf der konkreten Klassen von den in Fabrik1 bzw. Fabrik2 implementierten Fabrikmethoden erledigt wird. Da die Anwendungslogik nur die Interfaces verwendet, kann eine konkrete Fabrik einfach gegen eine andere ausgetauscht werden. 4 / 20 Übersicht: Erzeugungsmuster Strukturmuster Diagramm: Erbauer 5 / 20 Übersicht: Erzeugungsmuster Strukturmuster Wesentliche Eigenschaften Der Erbauer (Builder) ist ein Entwurfmuster, in dem ein Direktor die Aufgabe übernimmt, über einen Erbauer Schritt für Schritt ein Endprodukt aufzubauen. Hierbei verwendet der Direktor ein Erbauer-Interface, das konkrete Produkt wird über den konkreten Erbauer zusammen gebaut. Häufig werden innerhalb des Erbauers weitere Entwurfsmuster verwendet, z. B. ist der Erbauer oft ein Kompositum. Handout S. 2 6 / 20 Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Diagramm: Singleton 7 / 20 Übersicht: Erzeugungsmuster Strukturmuster Wesentliche Eigenschaften Das Singleton soll sicher stellen, dass nur eine Instanz einer Klasse existiert, wobei besondere Vorsichtsmaßnahmen bei Nebenläufigkeit erforderlich sind (s. 3. Vorlesung). Das Singleton ist ein umstrittenes Entwurfsmuster und wird häufig sogar als anti pattern bezeichnet, dessen Verwendung vermieden werden sollte. 8 / 20 Übersicht: Erzeugungsmuster Strukturmuster Gründe für Anti-Pattern • Das Singleton verstößt gegen das Single Responsibility Principle: Ein Singleton erledigt neben der eigentlichen Funktionalität noch das Kümmern darum, dass es nur ein Exemplar gibt. • Ein Singleton ist ein potenzielles Speicherloch: Wer kümmert sich darum, dass die bereitgestellte Instanz wieder zerstört und belegte Ressourcen freigegeben werden? • Ein Singleton verführt zu prozeduralem Programmierstil, d. h. das Singleton stellt letztendlich das Gegenstück zu globalen Variablen zur Verfügung. Handout S. 3 9 / 20 Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Gründe für Anti-Pattern (Forts.) • Vererbung ist bei Singletons schwierig bis unmöglich. • Ein Singleton verschleiert Abhängigkeiten zu anderen Objekten. Anstatt bei Operationen Referenzen auf dafür notwendige Objekte zu übergeben (damit expliziter Ausdruck der Abhängigkeit in der API), werden die (unsichtbar) innerhalb der Implementation über das Singleton geholt. 10 / 20 Übersicht: Erzeugungsmuster Strukturmuster Diagramm: Prototyp 11 / 20 Übersicht: Erzeugungsmuster Strukturmuster Wesentliche Eigenschaften Das Prototype-Muster (prototype) dient wie die Abstrakte Fabrik dem Erzeugen von Instanzen von verschiedenen konkreten Produkten, die ein gemeinsames Produkt-Interface implementieren. Im Gegensatz zur Abstrakten Fabrik wird jedoch nicht für jede konkrete Produktklasse eine Fabrikklasse implementiert, die die entsprechende Erzeugungsmethode bereitstellt, sondern hier unterstützt jedes Produkt die Operation, von sich selbst eine Kopie zu erstellen. Typischerweise benötigt man eine Vorlage für das Produkt (den Prototypen), die zum Erstellen von Produkten als Kopie dient. Analogie: Erzeugen eines Dokumentes in einem Office-Programm von einer Vorlage. Handout S. 4 12 / 20 Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Beispiel 13 / 20 Übersicht: Erzeugungsmuster Strukturmuster Code: Interface Animal und dessen Implementation Animal.java: public interface Animal { public String getDescription(); public int getLegs(); public Animal cloneAnimal(); } AnimalImpl.java: class AnimalImpl implements Animal, Cloneable { private String description; private int legs; public void setDescription(String description) { this.description = description; } public void setLegs(int legs) { this.legs = legs; } 14 / 20 Übersicht: Erzeugungsmuster Strukturmuster Code (Forts.) AnimalImpl.java (Forts.): @Override public String getDescription() { return description; } @Override public int getLegs() { return legs; } @Override public Object cloneAnimal() { try { return (Animal) super.clone(); } catch (CloneNotSupportedException e) { return null; } } } Handout S. 5 15 / 20 Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Einführung: Strukturmuster Zu den von der Gang of Four präsentierten Mustern gehören mehrere Strukturmuster, die über die Definition von Relationen zwischen Klassen übergeordnete Strukturen definieren: • Adapter • Bridge (Brücke) • Composite (Kompositum) • Decorator (Dekorierer) • Facade (Fassade) • Flyweight (Fliegengewicht) • Proxy (Stellvertreter) 16 / 20 Übersicht: Erzeugungsmuster Strukturmuster Beispiel Im Folgenden wird eine Anwendung entwickelt, die Text mit Auszeichnungen wie Fett und Kursiv versehen kann, die dann als HTML exportiert werden können. Hierbei kommen folgende Elementtypen vor: • Normaler Text ohne Auszeichnung. • Text, der fett oder kursiv formatiert wird. • Kombinationen aus verschieden formatierten Textstücken. • Wiederum fett oder kursive formatierte Kombinationen aus formatierten Textstücken. • Usw. usw. Insgesamt hat der formatierte Text eine Baumartige Struktur. 17 / 20 Übersicht: Erzeugungsmuster Strukturmuster Beispiel Dies ist mein Hund ergibt: Dies ist <it>mein <b>Hund</b></it> Handout S. 6 18 / 20 Übersicht: Erzeugungsmuster Strukturmuster Vorlesung 05 Klassendiagramm 19 / 20 Übersicht: Erzeugungsmuster Strukturmuster Verwendete Strukturmuster In dem Beispiel werden zwei Strukturmuster verwendet: • Das Kompositum (composite) beschreibt die baumartige Struktur mit Verästelungen (die Kindelemente haben können) und Blättern (die keine Kinder haben können). Das Typische am Kompositum ist, dass es sich beliebig häufig selbst enthalten kann. • Der Dekorierer (decorator) beschreibt hier die Klasse StyleDecorator, die das Interface Component implementiert, indem sie auf einer anderen Komponente aufsetzt, derer HTML-Code durch <b>...</b> bzw. <it>...</it> dekoriert wird. Die Methode getHTML() wird nicht eigenständig implementiert, sondern leitet den Aufruf an die intern benutzte Komponente weiter. 20 / 20 Handout S. 7