24.11.2021 |

Prototype

Prototyp Pattern

Das "prototyp pattern" ist aus der Kategorie der Erzeugungsmuster und dient zur Erzeugung neuer Instanzen auf Grundlage von prototypischen Instanzen („Vorlagen“). Dadurch wird eine Vorlage kopiert und an neue Bedürfnisse angepasst. Also anstatt neue Objekte zu erstellen, muss nur die prototypische Instanz geklont und an die neuen Bedürfnisse angepasst werden.

Quelle: Wikipedia

Klient: Der Klient stellt das Objekt dar, welches ein gewünschtes Objekt nutzen möchte.

Prototyp: Definiert die Schnittstelle.

KonkreterPrototyp1 / KonkreterPrototyp2: Implementiert die Schnittstelle und dient als Vorlage für sich selbst.

Beispiel

Original: Baeldung

Angenommen wir haben ein Computerspiel, indem im Hintergrund immer Bäume und Gebäude zusehen sind. Wir können uns vorstellen, dass wir nicht jedes Mal, wenn sich die Spielfigur bewegt, neue Bäume oder Gebäude mit allen expliziten Parametern erstellen und auf dem Bildschirm darstellen wollen. Also erstellen wir zuerst eine Instanz des Baums. Dann können wir beliebig viele Bäume aus dieser Instanz (Prototyp) erstellen und ihre Positionen aktualisieren. Wir könnten auch die Farbe der Bäume für eine neue Ebene im Spiel z.b. ändern.

Das Prototyp-Muster ist ganz ähnlich. Anstatt neue Objekte zu erstellen, müssen wir nur die prototypische Instanz klonen. Eine der Möglichkeiten, dieses Muster in Java zu implementieren, ist die Verwendung der clone()-Methode. Dazu müssen wir die Schnittstelle Cloneable implementieren. Wenn wir versuchen zu klonen, sollten wir uns entscheiden, ob wir eine flache oder eine tiefe Kopie erstellen wollen. Letztendlich kommt es auf die Anforderungen an. Wenn die Klasse zum Beispiel nur primitive und unveränderliche Felder enthält, können wir eine flache Kopie verwenden. Enthält sie Verweise auf veränderbare Felder, sollten wir eine tiefe Kopie verwenden. Dies kann durch Kopierkonstruktoren oder Serialisierung und Deserialisierung geschehen. Nehmen wir das oben erwähnte Beispiel und sehen wir uns an, wie wir das Prototype-Muster anwenden können, ohne die Cloneable-Schnittstelle zu verwenden. Dazu erstellen wir eine abstrakte Klasse namens Baum mit einer abstrakten Methode 'copy'.

public abstract class Baum {
    
    // ...
    public abstract Baum copy();
    
}
public class PlastikBaum extends Baum {

    // ...

    @Override
    public Baum copy() {
        PlastikBaum plastikBaumKlon = new PlastikBaum(this.getMass(), this.getHeight());
        plastikBaumKlon.setPosition(this.getPosition());
        return plastikBaumKlon;
    }

}
public class KiefernBaum extends Baum {
    // ...

    @Override
    public Baum copy() {
        KiefernBaum kiefernBaumKlon = new KiefernBaum(this.getMass(), this.getHeight());
        kiefernBaumKlon.setPosition(this.getPosition());
        return kiefernBaumKlon;
    }
}

Hier sehen wir also, dass die Klassen, die Baum erweitern und die Kopiermethode implementieren, als Prototypen für die Erstellung einer Kopie von sich selbst fungieren können.

Mit dem Prototypenmuster können wir auch Kopien von Objekten erstellen, ohne von den konkreten Klassen abhängig zu sein. Nehmen wir an, wir haben eine Liste von Bäumen, von denen wir Kopien erstellen möchten. Dank der Polymorphie können wir leicht mehrere Kopien erstellen, ohne die Typen der Bäume zu kennen.

Abgrenzung

Das Prototyp Pattern ist ähnlich zum Flyweight Pattern mit dem Unterschied, dass beim Flyweight keine neuen Objekte erzeugt werden.

Zur Übersicht
Patrick Schaper

Mehr vom Devsquad...

Sven Röttering

Bridge

Sven Röttering

Das Decorator Pattern

Hallo, ich bin Jörg Herbst!

Ich bin der CEO von newcubator und freue mich über jede Nachricht!

* Pflichtfeld