ProgTrain – Train your Brain

Freier Content.

Für den Aufbau wiederverwendbarer Objektmodelle werden Entwurfsmuster eingesetzt. Dabei stellt solch ein Muster einen allgemeingültigen Entwurf eines Klassendiagramms für die Menge von ähnlichen Aufgabenstellungen zur Verfügung.

Die Entwurfsmuster lassen sich hinsichtlich ihres Anwendungsbereiches unter anderem klassifizieren in:

  • Erzeugungsmuster: legen fest, wann wie viele Objekte von einer Klasse instanziiert werden können
  • Verhaltensmuster betreffen die situationsabhängige Implementierung von Methoden (dem Verhalten von Objekten)

Die Fabrikmethode beschreibt die Verwendung einer Fabrik zur Erzeugung von Objekten. Auf diese Weise soll die Menge der Objekte als auch die Zuweisung ungültiger Eigenschaftswerte reglementiert werden. Insofern gehört die Fabrikmethode also zu den Erzeugungsmustern.

Erzeugungsmuster

Jede Klasse definiert für die Erzeugung von Objekten mindestens einen Konstruktor (wenn keiner angegeben ist, dann Standardkonstruktor).

Jedem Konstruktor wird ein Zugriffsrecht zugewiesen. Diese ist normalerweise public, um eine direkte Objektinstanziierung zu erlauben.

public class Klasse{
public Klasse(){}
}
...
Klasse k = new Klasse();

Auf diese Weise können generell beliebig viele Objekte einer Klasse erzeugt werden. Möchte man die Anzahl der Objektinstanzen allerdings reglementieren, muss man das Zugriffsrecht des Konstruktors ändern.

  • private: nur die Klasse selbst darf ein Objekt erzeugen (Entwurfsmuster Singleton)
  • protected: eine direkte Instanziierung ist nur innerhalb des gleichen Pakets (java) oder der gleichen Assembly (C#) möglich

In diesem Fall ist der generelle Aufbau der Objektbeziehungen wie folgt zu realisieren:

Allgemeiner Aufbau der Fabrikmethode im Klassendiagramm

Das Beispiel

Schauen wir uns ein Beispiel zur Verwendung der Fabrikmethode an. Eine Fabrik produziert Schuhe. Der Preis der Schuhe wird von der Fabrik festgelegt; die Farbe der Schuhe kann vom Käufer aus einer Farbpalette ausgewählt werden.

Die Klasse Shoe

Das Produkt, welches erzeugt werden soll, sind Schuhe. Einem Schuh weisen wir als Objekteigenschaften eine Farbe sowie einen Preis zu.

  • die Farbe des Schuhs wird bei der Konstruktion festgelegt
  • der Preis des Schuhs wird anschließend bestimmt.

Auf beide Eigenschaften kann generell nur lesend zugegriffen werden. Der Preis wird von der Fabrik bestimmt. Die Farbe kann vom Kunden (derjenige, welcher in der Fabrik nach einem Schuh anfragt) festgelegt werden, wobei ein bestimmtes Farbspektrum zur Verfügung steht.

package production;
class Shoe{
private double price;
private String color;
protected Shoe(double p, String c){
price = p;
color = c;
}}

Die beiden Objekteigenschaften der Schuhe werden im Konstruktor festgelegt. Da hier für beide Eigenschaften Bedingungen gelten (nur bestimmte Farben sowie ein festgelegter Preis), wäre ein öffentlich zugänglicher Konstruktor suboptimal. Jeder könnte dann nämlich ein Objekt der Klasse instanziieren und die Eigenschaften frei festlegen.

Die Zuweisung korrekter Eigenschaften bei der Konstruktion eines Schuhs wird nun VOR dem Aufruf des Konstruktors in einer Fabrik geregelt.

Die Klasse Factory

In dieser Klasse definieren wir eine Methode für die Erzeugung und Rückgabe eines neuen Objektes der Klasse Schuh. Der Methode wird die Farbe übergeben, welche der Schuh haben soll. Ein roter und ein schwarzer Schuh können produziert werden, jeweils mit einem anderen Preis. Für alle anderen Farben wird der Wert null zurückgegeben (es gibt kein Objekt).

package production;
public class Factory {
public Shoe getShoe(String color)
{
switch(color)
{
case "black": return new Shoe("black", 69.99);
case "red": return new Shoe("red", 79.89);
default: return null;
}
}
}

Das Programm

Und nun noch die Verwendung in einer kleinen Konsolenanwendung. Zunächst einmal brauchen wir eine Fabrik. Mit Hilfe dieser können wir zwei Objekte der Klasse Schuh versuchen zu erzeugen. Die Objektreferenz s1 wird tatsächlich auf ein Objekt der Klasse Schuh zeigen; Die Referenz s2 hingegen nicht.

import produktion.*;
public class Program {
public static void main(String[] args) {
Fabrik f = new Fabrik();
Schuh s1 = f.getSchuh("rot");
Schuh s2 = f.getSchuh("gruen");
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
}
}

Man beachte, dass sich die beiden Klassen Shoe und Factory in einem Paket befinden, während die Klasse mit dem Programm sich in einem anderen (hier dem default-Package) befindet.

Cookie Consent Banner von Real Cookie Banner