Was sind Design Patterns?

Die Definition von Design Patterns lautet:

Design Patterns (Entwurfsmuster) sind bewährte Muster oder Lösungen für Probleme, die immer wieder auf eine bestimmte Art auftreten. Sie lassen sich genauso wenig erfinden wie die Zahl Pi – sie werden entdeckt.

Fast alle Probleme die während des Programmierens auftreten wurden schon in irgend einer Art und Weise schon einmal gelöst. Die früheren Lösungen können auf das jetzige Problem umgelegt werden. Die Lösung ist sogar so Grundlegend das es auch viele Lösungen der Gleichen Art umlegen lässt.

Wenn die Problemlösung von vielen Entwicklern verwendet wird spricht man von einem Design Pattern oder auf Deutsch Entwurfsmuster.

Im 1995 verfassten Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides das Buch „Design Patterns elements of Reusable Object-Oriented Software„. Diese 4 Herren auch öfters „Gang of Four“ (GOF) genannt haben in Ihren Buch das grundlegende Wissen und Erfahrung von Softwareentwickler zusammengetragen. Das dort Verfasste ist so grundlegend das ihr Werk fast unverändert gedruckt wird.

Design Patterns werden in 3 Kategorien unterteilt:

  1. Erzeugungsmuster
  2. Verhaltensmuster
  3. Strukturmuster

 

Strukturmuster

Strukturmuster oder auch Structural Design Patterns beschreiben wie Klassen zusammengesetzt werden, um größere Einheiten zu bilden. Die einfachste Art um sich ein Strukturmuster vorstellen ist der Adapter. Ein klassischer Adapter außerhalb der Coding Welt kennen wir von Steckdosen.

Im Ausland benötigen wir einen Adapter, damit unser Geräte an die dortigen Steckdosen angesteckt werden können.

Beispiel für Strukturmuster sind:

  • Adapter
  • Facade Pattern
  • Proxy

Verhaltensmuster

Das Verhaltensmuster oder auch Behavioral Design Patterns genannt, beschreibt wie Klassen und Objekte zusammenarbeiten. Ein gutes Beispiel für ein Verhaltensmuster ist das Observer Pattern

Ein Objekt ändert seinen Zustand und ein anderes Objekt möchte darüber informiert werden. Wer informiert wenn? Fragt das eine Objekt nach oder wird es informiert? Gilt eine Hol oder eine Bring Schuld?

Die Aufgabe von Verhaltensmuster bestehen darin Vorschläge zu machen welches Objekte welche Aufgabe übernimmt.

Beispiele für Verhaltensmuster

Erzeugungsmuster

Erzeugungsmuster auch Creational Patterns genannt beschreibt das Erzeugen von Objekten. Neue Objekte werden mithilfe des new-Operator erstellt. In Ausnahmefällen wird die Objekt Erstellung versteckt. So kann die Objekterstellung auf die Methode getInstance() ausgelagert werden.

Beispiele für Erzeugungsmuster sind:

Singleton Pattern

Der Singleton Pattern ist einer der einfachsten Patterns. Er gehört zur Art der Creational Patterns.

Definition des Patterns laut der Gang of Four:

„Sichere ab, dass eine Klasse genau ein Exemplar besitzt, und stelle einen globalen Zugriffspunkt darauf bereit.“

Singleton Patterns werden verwendet wenn es nur eine Instanz von einer Klasse erlaubt ist. Dieses Pattern findet öfters Verwendung bei Verwaltung der Benutzerrechte einer Applikation.

Realisierung

Um die Realisierung in Java zu gewährleisten muss der Konstruktor auf private gesetzt werden. Damit ist der Zugriff nur innerhalb der Klasse oder durch andere Instanzen der Klasse möglich.

Als nächstes wird eine Methode definiert, die eine Instanz erstellt falls es noch keine gibt. Die Instanz der Klasse wird an den Aufrufer zurück gegeben.

Mithilfe eines statischen Feldes wird eine Referenz auf die Instanz gehalten. Wichtig ist die Instanz zum spät Möglichsten Zeitpunkt zu erstellen. Sprich bei der ersten Verwendung während der Laufzeit (lazy instantiation).


public class SingletonPattern {
  private staticSingletonPattern instance = null;
  private SingletonPattern() {}
  public static SingletonPattern getInstance() {
    if(instance == null) {
       instance = new SingletonPattern();
    }
    return instance;
  }
}

Kritik an Singleton

  • Jede Klasse soll sich nur auf eine Aufgabe konzentrieren. (Single Responsability Prinzip). Der Singleton Pattern hält sich nicht an dieses Prinzip. Sowohl Geschäftslogik als auch die Objekterzeugung wird in dieser Klasse umgesetzt.
  • Wie bei globalen Variablen ist die Abhängigkeit nicht sofort sichtbar. Ob eine Klasse die Singleton-Klasse verwendet ist nur im Code ersichtlich.
  • Singleton erschaffen eine Art von „globalen“ Zustand und erschweren somit die Testbarkeit.
  • Sofern die Instanz selber Attribute besitzt sind diese überall verfügbar.

Zusammenfassung

  • Singleton wird eingesetzt, wenn eine Klasse nur eine Instanz besitzen darf
  • Die Instanz braucht einen globalen Zugriffspunkt
  • Die Instanz soll zum spät Möglichsten Zeitpunkt erzeugt werden