Prototype-Muster
Das Prototype-Muster erstellt neue Objekte durch Kopieren eines vorhandenen Objekts (des Prototyps). Verwende es, wenn die Objekterstellung teuer ist und ein ähnliches Objekt bereits existiert – Klonen ist schneller und bequemer als das Erstellen von Grund auf.
Überblick
Das Prototype-Muster erzeugt neue Objekte, indem es eine vorgefertigte Instanz — den Prototyp — klont, anstatt einen Konstruktor zu durchlaufen. Es ist nützlich, wenn die Konstruktion des Objekts teuer ist (Netzwerkaufrufe, schweres Parsing) oder wenn die Konfiguration, die das Original erzeugt hat, nicht trivial ist und du sie wiederverwenden willst.
Wann verwenden
- Ein Objekt von Grund auf zu bauen ist teuer, aber ein bestehendes zu kopieren ist billig.
- Du brauchst viele Varianten desselben Basisobjekts und willst dessen Konstruktionslogik nicht wiederholen.
- Details der konkreten Klasse sollen verborgen bleiben — Clients klonen eine bekannte gute Instanz, statt eine zu verkabeln.
Beispiel
interface Cloneable<T> { clone(): T }
class Shape implements Cloneable<Shape> {
constructor(public x: number, public y: number, public color: string) {}
clone(): Shape {
return new Shape(this.x, this.y, this.color);
}
}
const original = new Shape(10, 20, "red");
const copy = original.clone();
copy.x = 99;
console.log(original.x, copy.x); // 10 99Vorteile
- Überspringt teures Setup, indem eine bereits initialisierte Instanz kopiert wird.
- Versteckt konkrete Klassen hinter einer `clone()`-Methode — Clients hängen nicht von Konstruktoren ab.
- Fördert Komposition: baue ein Register von Prototypen und klone, was du brauchst.
Nachteile
- Deep-Copying von Objekten mit zirkulären Referenzen oder geteilten Ressourcen ist heikel.
- Jede Klasse im Graph muss clone korrekt implementieren — ein Feld zu vergessen ist leicht.
- Die Explizitheit einer Konstruktor-Signatur geht verloren.