Entwurfsmuster

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Entwurfsmuster (englisch design patterns) sind bewährte Lösungsschablonen für wiederkehrende Entwurfsprobleme sowohl in der Architektur als auch in der Softwarearchitektur und -entwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem bestimmten Zusammenhang einsetzbar ist. In den letzten Jahren hat der Ansatz der Entwurfsmuster auch zunehmendes Interesse im Bereich der Mensch-Computer-Interaktion gefunden. Ursprünglich wurde der Begriff in der Architektur von Christopher Alexander verwendet.[1]

Arten von Entwurfsmustern[Bearbeiten | Quelltext bearbeiten]

Das Entwurfsmuster Prototyp mit der Unified Modeling Language (UML)

Es gibt verschiedene Typen von Entwurfsmustern. Ursprünglich wurden folgende Typen vom Autorenquartett Gang of Four (GoF)[2] unterschieden:

Dienen der Erzeugung von Objekten. Sie entkoppeln die Konstruktion eines Objekts von seiner Repräsentation. Die Objekterzeugung wird gekapselt und ausgelagert, um den Kontext der Objekterzeugung unabhängig von der konkreten Implementierung zu halten, gemäß der Regel: „Programmiere auf die Schnittstelle, nicht auf die Implementierung!“
Erleichtern den Entwurf von Software durch vorgefertigte Schablonen für Beziehungen zwischen Klassen.
Modellieren komplexes Verhalten der Software und erhöhen damit die Flexibilität der Software hinsichtlich ihres Verhaltens.

Später kamen noch weitere Typen für diejenigen Entwurfsmuster, die in keine der drei genannten Typen passten, hinzu. Darunter beispielsweise:

Dienen der Ablage und dem Zugriff von Objekten und deren Beziehungen in einer relationalen Datenbank.[3]
Für die Erstellung, die Weiterleitung und die Umwandlung von Daten in Form von Nachrichten, inklusive der dazu benötigten Nachrichtenkanäle und Nachrichtenendpunkte, sowie Komponenten für die Systemverwaltung.

Geschichte[Bearbeiten | Quelltext bearbeiten]

Ein Ansatz für Entwurfsmuster wurde vom Architekten Christopher Alexander 1964 in Notes on the synthesis of form dargestellt. Zwischen 1977 und 1979 stellte er dann, in einer auf den römischen Architekten Marcus Vitruvius Pollio, genannt Vitruv, zurückgehenden Tradition, eine Sammlung von Entwurfsmustern zusammen.[4] Die Hauptaufgabe dieser Muster war es, die Bewohner der zu bauenden Strukturen in den Entwurfsprozess mit einzubinden. In der Architektur hat sich diese Idee jedoch bei weitem nicht so verbreitet wie später in der Softwareentwicklung.

Kent Beck und Ward Cunningham griffen 1987 die Ideen Alexanders aus der Architektur auf und entwickelten Entwurfsmuster für die Erstellung von grafischen Benutzeroberflächen in Smalltalk. Ein Jahr später begann Erich Gamma mit seiner Promotion an der Universität Zürich über die generelle Übertragung dieser Methode auf die Softwareentwicklung. Parallel dazu arbeitete James Coplien in den Jahren 1989 bis 1991 an musterähnlichen Idiomen für C++ und veröffentlichte 1991 sein Buch Advanced C++ Idioms.

Erich Gamma beendete im selben Jahr seine Promotion und ging im Anschluss in die Vereinigten Staaten. Dort brachte er 1994 zusammen mit Richard Helm, Ralph Johnson und John Vlissides das Buch Design Patterns – Elements of Reusable Object-Oriented Software heraus, in dem 23 Entwurfsmuster beschrieben sind. Die vier Autoren sind unter Entwicklern weltweit auch unter ihrem Spitznamen Gang of Four (Viererbande), kurz GoF, bekannt und verhalfen mit ihrem Buch den Entwurfsmustern zu einem Durchbruch. Gelegentlich wird GoF auch als Verweis auf das besagte Buch verwendet. Anders als Alexander, der seine Muster vor allem für Laien geschrieben hatte, richten sich die GoF-Muster an Softwareentwickler und nicht an Benutzer.

Anforderungen und Nutzen[Bearbeiten | Quelltext bearbeiten]

Ein gutes Muster sollte

  • ein oder mehrere Probleme lösen,
  • ein erprobtes Konzept bieten,
  • auf realen Designs basieren,
  • über das rein Offensichtliche hinausgehen,
  • den Benutzer in den Entwurfsprozess einbinden,
  • Beziehungen aufzeigen, die tiefergehende Strukturen und Mechanismen eines Systems umfassen.

Entwurfsmuster beinhalten in der Regel Referenzen auf andere Muster. Mithilfe dieser ist es möglich, Mustersprachen zu entwickeln.

Der primäre Nutzen eines Entwurfsmusters liegt in der Beschreibung einer Lösung für eine bestimmte Klasse von Entwurfsproblemen. Weiterer Nutzen ergibt sich aus der Tatsache, dass jedes Muster einen Namen hat. Dies vereinfacht die Diskussion unter Entwicklern, da man abstrakt über eine Struktur sprechen kann. So sind etwa Software-Entwurfsmuster – im Gegensatz zu Idiomen – zunächst einmal unabhängig von der konkreten Programmiersprache.

Wenn der Einsatz von Entwurfsmustern dokumentiert wird, ergibt sich ein weiterer Nutzen dadurch, dass durch die Beschreibung des Musters ein Bezug zur dort vorhandenen Diskussion des Problemkontextes und der Vor- und Nachteile der Lösung hergestellt wird.

Nachteile[Bearbeiten | Quelltext bearbeiten]

Der erfolgreiche Einsatz von Entwurfsmustern in der Vergangenheit kann dazu verleiten, die Entwurfsmuster als Wunderwaffe und Garant für gutes Design anzusehen. Unerfahrene Entwickler können geneigt sein, möglichst viele bekannte Muster zu verwenden, und dabei übersehen, dass in ihrem Fall vielleicht eine elegantere Lösung ohne den Einsatz von Mustern möglich wäre. Entwurfsmuster garantieren nicht, dass der Entwurf gut ist. Insofern ist die Anwendung zu vieler oder ungeeigneter Entwurfsmuster ein Antimuster.

Musterkataloge[Bearbeiten | Quelltext bearbeiten]

Entwurfsmuster werden üblicherweise nach dem Vorbild der Bücher von Christopher Alexander und der Gang of Four in sogenannten Musterkatalogen (englisch „Design Pattern Catalogs“) gesammelt. Diese beschreiben die einzelnen Muster katalogartig anhand ihrer Eigenschaften. Diese Eigenschaften sind beispielsweise beim Buch Design Patterns – Elements of Reusable Object-Oriented Software folgende: Aufgabe, Andere Namen, Motivation, Anwendbarkeit, Struktur, Teilnehmer, Kollaborationen, Konsequenzen, Implementierung, Beispielcode, bekannte Verwendungen, verwandte Muster.

Neben dem Entwurfsmusterkatalog der Gang of Four gibt es eine Reihe weiterer Kataloge. Zu diesen zählen die Bücher Enterprise Integration Patterns, Patterns of Enterprise Application Architecture, Pattern-Oriented Software Architecture, Volume 1, A System of Patterns, Refactoring To Patterns sowie die Core J2EE Patterns. (Siehe dazu auch Abschnitt Literatur unten.)

Erzeugungsmuster (Creational Patterns)[Bearbeiten | Quelltext bearbeiten]

Erzeugungsmuster[5] dienen der Erzeugung von Objekten. Sie entkoppeln die Konstruktion eines Objekts von seiner Repräsentation.

Die abstrakte Fabrik definiert eine Schnittstelle zur Erzeugung von Objekten gleichen Typs, wobei die konkreten Klassen der zu erzeugenden Objekte erst zur Laufzeit festgelegt werden.
Von einer Klasse soll nur ein einziges Mal ein Objekt erzeugt werden, beispielsweise, weil eine nur ein Mal existierende, zentrale Struktur verwendet werden soll oder eine Hardware-Komponente physikalisch nur einmal existiert.
Das Entwurfsmuster Erbauer trennt den Aufbau komplexer Objekte von ihrer konkreten Darstellung. Dadurch soll ermöglicht werden, dass derselbe Konstruktionsprozess verschiedene Darstellungen erzeugen kann.
Mehrere verwandte Typen (Klassen) von Objekten implementieren die gleiche Schnittstelle, unterscheiden sich jedoch in Namen und Verwendungszweck. Nun soll in einem Programmkontext ein konkretes Objekt eines bestimmten Typs erzeugt werden.
Variante des Singleton-Musters, das die Anzahl erzeugter Objekte kontrolliert, beispielsweise, um die Anzahl gleichzeitig geöffneter Datenbankverbindungen auf einen für eine gute Gesamtleistung erforderlichen Wert zu reduzieren.
Das Entwurfsmuster Prototyp verwendet ein Objekt als Vorlage, um daraus weitere Objekte zu erzeugen, die anschließend modifiziert werden können.

Strukturmuster (Structural Patterns)[6][Bearbeiten | Quelltext bearbeiten]

Siehe #Liste von Mustern.

Verhaltensmuster (Behavioral Patterns)[7][Bearbeiten | Quelltext bearbeiten]

Siehe #Liste von Mustern.

Nachrichtenübermittlungsmuster (Messaging Patterns)[8][Bearbeiten | Quelltext bearbeiten]

Übersicht der Basismuster und der Kapitel der Enterprise Integration Patterns

Integrationsmöglichkeiten (Integration Style)[Bearbeiten | Quelltext bearbeiten]

Die standardmäßig unsortierte Reihenfolge der Muster in den Tabellen der nachfolgenden Abschnitte entspricht der im Originaldokument.[8]

Nachrichtenerzeugung (Message Construction)[Bearbeiten | Quelltext bearbeiten]

Name Beschreibung
Vorlagenseite dieser Tabelle
Message Zum Verpacken von Informationen in eine Nachricht, die das Nachrichtenübertragungssystem über einen Nachrichtenkanal übertragen kann.
Command Message Zum zuverlässigen Ausführen von Vorgängen in einer anderen Anwendung.
Document Message Um eine Datenstruktur zuverlässig zwischen Anwendungen zu übertragen.
Event Message Für zuverlässige, asynchrone Benachrichtigung über Ereignisse zwischen Anwendungen.
Request-Reply Zum Senden eines Paares von Anfrage und Antwort, jede auf ihrem eigenen Kanal.
Return Address Die Anfrage sollte eine Absenderadresse enthalten, die angibt, wohin die Antwort gesendet werden soll.
Correlation Identifier Jede Antwort sollte eine Beziehungskennung enthalten, das heißt, eine eindeutige Kennung, die angibt, zu welcher Anfrage eine Antwort gehört.
Message Sequence Wenn eine große Menge von Daten in Teile von Nachrichtengröße zerteilt werden soll, sollen die Teile als Sequenz von Nachrichten gesendet werden, wobei jede Nachricht mit Informationen zur Bestimmung der Reihenfolge versehen ist.
Message Expiration Zum Setzen eines Zeitlimits, das angibt, wie lange die Nachricht zu gebrauchen ist.
Format Indicator Ein Formatbezeichner, mit dem die Nachricht angibt, welches Format sie benutzt.

Nachrichtenkanäle (Messaging Channels)[Bearbeiten | Quelltext bearbeiten]

Name Beschreibung
Vorlagenseite dieser Tabelle
Message Channel Zum Verbinden von Anwendungen mit einem Nachrichtenkanal, in den eine Anwendung Informationen schreibt und eine andere diese daraus liest
Point-to-Point Channel Zum Senden einer Nachricht über einen Punkt-Zu-Punkt-Kanal, der sicherstellt, dass nur ein Empfänger diese einzelne Nachricht erhält
Publisher-Subscriber Channel Zum Senden eines Ereignisses über einen Publisher-Subscriber-Kanal, der eine Kopie eines einzelnen Ereignisses an jeden Empfänger sendet
Datatype Channel Für einen separaten Kanal für jeden Datentyp, damit alle Daten auf einem Kanal vom gleichen Typ sind
Invalid Message Channel Ein Empfänger sollte unpassende Nachrichten in einen Kanal für ungültige Nachrichten stellen. Das ist ein spezieller Kanal für Nachrichten, die von ihren Empfängern nicht verarbeitet werden konnten.
Dead Letter Channel Wenn ein Nachrichtenübermittlungssystem erkennt, dass es ein Nachricht nicht senden kann oder sollte, kann es einen Toter-Briefkasten-Kanal auswählen und die Nachricht dort hin stellen.
Guaranteed Delivery Ein garantierte Lieferung, die Nachrichten persistiert, damit sie nicht verloren gehen, wenn das Nachrichtenübermittlungssystem abstürzt
Channel Adapter Zum Zugreifen auf die Programmierschnittstelle einer Anwendung und zum Verbreiten einer Nachricht auf einem auf dieser Nachricht basierenden Kanal, sowie um Nachrichten aus der Anwendung zu empfangen und Funktionalität innerhalb der Anwendung aufzurufen
Messaging Bridge Zum replizieren von Nachrichten zwischen Nachrichtenübermittlungssystemen
Message Bus Eine Anwendungen verbindende Middleware wird als Nachrichtenbus eingerichtet, damit die Anwendungen via Nachrichtenübermittlung zusammenarbeiten können.

Nachrichtenweiterleitung (Message Routing)[Bearbeiten | Quelltext bearbeiten]

Muster Beschreibung
Pipes-and-Filters
Message Router
Content-based Router
Message Filter
Dynamic Router
Recipient List
Splitter Zum Aufspalten einer zusammengesetzten Nachricht in Einzelnachrichten, von denen jede Daten zu einem der Teile enthält.
Aggregator
Resequencer
Composed Message Processor
Scatter-Gather
Routing Slip
Process Manager
Message Broker

Nachrichtenumwandlung (Message Transformation)[Bearbeiten | Quelltext bearbeiten]

Muster Beschreibung
Message Translator
Envelope Wrapper
Content Enricher
Content Filter
Claim Check
Normalizer
Canonical Data Model

Nachrichtenendpunkte (Messaging Endpoints)[Bearbeiten | Quelltext bearbeiten]

Muster Beschreibung
Message Endpoint
Messaging Gateway
Messaging Mapper
Transactional Client
Polling Consumer
Event-driven Consumer
Competing Consumers
Message Dispatcher
Selective Consumer
Durable Subscriber
Idempotent Receiver
Service Activator

Systemverwaltung (System Management)[Bearbeiten | Quelltext bearbeiten]

Muster Beschreibung
Control Bus
Detour Eine Umleitung mittels eines kontextbasierten Routers über einen Steuerbus. In einem Zustand leitet der Router hereinkommende Nachrichten an zusätzliche Schritte, im anderen leitet er diese direkt zum Empfängerkanal.
Wire Tap
Message History
Message Store
Smart Proxy
Test Message
Channel Purger

Liste von Mustern[Bearbeiten | Quelltext bearbeiten]

Die folgende Tabelle enthält Entwurfsmuster der Gang of Four, funktionale Verhaltensmuster von Stuart Sierra sowie andere Entwurfsmuster aus anderen Katalogen. Die ersten drei Spalten stellen die Teilmengen dar, in die die Entwurfsmuster im Buch Design Patterns kategorisiert wurden. Die vierte Spalte enthält Muster für die objektrelationale Abbildung die insbesondere von Martin Fowler geprägt wurden.[3] Die fünfte Spalte enthät Entwurfsmuster für die Kommunikation zwischen Anwendungen, die von Gregor Hope und Bobby Woolf im Buch Enterprise Integration Patterns[9] beschrieben wurden. Die sechste Spalte enthält Entwurfsmuster, die sich in keine der ersten fünf Spalten einordnen lassen. Die Liste ist nicht vollständig und überschneidet sich teilweise mit Architekturmustern.

Erzeugungsmuster (Creational patterns) Strukturmuster (Structural patterns) Verhaltensmuster (Behavioral patterns) Muster für objektrelationale Abbildung Muster zur Nachrichtenübermittlung Weitere Muster
Erbauer (Builder) Container (Container) Interceptor (Interceptor) Datentransferobjekt (Data transfer object) Messaging Mapper Extension Interface
Fabrikmethode (Factory method) Dekorierer (Decorator) Interpreter (Interpreter) Table Data Gateway Transactional Client Fluent Interface
Multiton (Multiton) Fassade (Facade) Iterator (Iterator) Row Data Gateway Polling Consumer Inversion of Control
Prototyp (Prototype) Fliegengewicht (Flyweight) Kommando (Command) Active Record Event-driven Consumer Transaction Script
  Kompositum (Composite oder Whole-Part) Memento (Memento) Unit of Work Competing Consumers Table Module
  Stellvertreter (Proxy) Nullobjekt (Null Object) Identity Map Message Dispatcher Page Controller
  Half Object Plus Protocol Schablonenmethode (Template method) Lazy Loading Selective Consumer Template View
  Strategie (Strategy) Identity Field Durable Subscriber Transform View
    Vermittler (Mediator) Dependent Mapping Idempotent Receiver Two-Step View
    Zustand (State) Embedded Value Service Activator Application Controller
    Zuständigkeitskette (Chain of responsibility) Serialized LOB Message Remote Facade
    State/Event Inheritance Mapper Command Message Locks
    Consequences Metadata Mapping Document Message Session States
    Accumulator Query Object Event Message Repository
    MapReduce Command-Query-Responsibility-Segregation Request-Reply Value Object
    Reduce/Combine   Return Address Registry
    Rekursive Erweiterung Correlation Identifier
    Software Pipelining   Message Sequence
    Prozess Wrapper   Message Expiration
    Token   Format Indicator
    Page Object   Message Channel
        Point-to-Point Channel
        Publisher-Subscriber Channel
        Datatype Channel
        Invalid Message Channel
        Dead Letter Channel
        Guaranteed Delivery
        Channel Adapter
        Messaging Bridge
        Message Bus
        Pipes-and-Filters
        Message Router
        Content-based Router
        Message Filter
        Dynamic Router
        Recipient List
        Splitter
        Aggregator
        Resequencer
        Composed Message Processor
        Scatter-Gather
        Routing Slip
        Process Manager
        Message Broker
        Message Translator
        Envelope Wrapper
        Content Enricher
        Content Filter
        Claim Check
        Normalizer
        Canonical Data Model
        Control Bus
        Detour
        Wire Tap
        Message History
        Message Store
        Smart Proxy
        Test Message
Channel Purger
Legende
Entwurfsmuster der Viererbande Verhaltensmuster von Stuart Sierra Muster für ORM von Martin Fowler Muster zur Nachrichtenübermittlung andere Entwurfsmuster

Andere Arten von Mustern[Bearbeiten | Quelltext bearbeiten]

Die Arbeiten der Gang of Four haben viele Autoren zu weiteren Veröffentlichungen angeregt. Daraus entstand auch die Problematik, dass ein Muster sich nicht mehr ohne weiteres als Entwurfsmuster klassifizieren lässt. Vielmehr gibt es graduelle Unterschiede in der Granularität von Mustern. So wird etwa das Model-View-Controller-Muster (MVC) manchmal als Architekturmuster, manchmal als Entwurfsmuster eingesetzt.[10]

Beispiele für Muster, die keine Entwurfsmuster sind:

Antimuster[Bearbeiten | Quelltext bearbeiten]

Wo Entwurfsmuster in der Software-Entwicklung allgemein übliche und bekannte Lösungsansätze sind, um Probleme zu lösen, so sind Antimuster Negativ-Beispiele von bereits durchgeführten Lösungen, die Hinweise darauf geben, welche Fehler vermieden werden sollten.

Nachdem bei der Softwareentwicklung immer mehr von positiven Erfahrungen von erfolgreich abgeschlossenen Aufgabenstellungen profitiert wurde, konzentrierte man sich auch darauf, die Negativbeispiele, also wiederkehrende Fehler bei der Software-Entwicklung, zu identifizieren und zu dokumentieren.

Siehe auch[Bearbeiten | Quelltext bearbeiten]

Literatur[Bearbeiten | Quelltext bearbeiten]

Deutsch
  • Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal: Pattern-orientierte Softwarearchitektur. Ein Pattern-System. Addison-Wesley-Longman, Bonn 1998, ISBN 3-8273-1282-5.
  • Helmut Leitner: Mustertheorie – Einführung und Perspektiven auf den Spuren von Christopher Alexander. Verlag Nausner & Nausner, Graz 2007, ISBN 978-3-901402-50-0.
  • Florian Siebler: Design Patterns mit Java: Eine Einführung in Entwurfsmuster. Hanser-Verlag, 2014, ISBN 978-3-446-43616-9.
Englisch

Weblinks[Bearbeiten | Quelltext bearbeiten]

Wikibooks: Entwurfsmuster – Lern- und Lehrmaterialien

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Andreas Zeller: Entwurfsmuster auf st.cs.uni-saarland.de (PDF, S. 2.)
  2. Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides: Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software. Addison-Wesley, München 2004, ISBN 3-8273-2199-9 (englisch: Design Patterns. Elements of Reusable Object-Oriented Software.).
  3. a b Martin Fowler: Patterns of Enterprise Application Architecture. Addison-Wesley-Longman, Amsterdam 2002, ISBN 0-321-12742-0.
  4. Christopher Alexander, Sara Ishikawa, Murray Silverstein, Max Jacobson, Ingrid Fiksfahl-King, Shlomo Angel: Eine Muster-Sprache. Städte, Gebäude, Konstruktion. Löcker, Wien 1995, ISBN 3-85409-179-6.
  5. Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides: Creational Patterns. In: GofPatternss. 30. November 2020, abgerufen am 30. November 2020 (englisch).
  6. Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides: Structural Patterns. In: GofPatterns. 30. November 2020, abgerufen am 30. November 2020 (englisch).
  7. Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides: Behavioral Patterns. In: GofPatterns. 30. November 2020, abgerufen am 30. November 2020 (englisch).
  8. a b Gregor Hohpe, Bobby Woolf: Enterprise Integration Patterns. Messaging Patterns, abgerufen am 5. Dezember 2020 (englisch).
  9. Gregor Hohpe, Bobby Woolf: Enterprise Integration Patterns. Designing, Building and Deploying Messaging Solutions. Addison-Wesley, Boston 2003, ISBN 0-321-20068-3 (englisch).
  10. Kamal Wickramanayake: Is MVC a design pattern or an architectural pattern? (englisch) In: Software View. 17. Juli 2010. Abgerufen am 16. Dezember 2016.