Prototyp (Entwurfsmuster)

Prototyp (Entwurfsmuster)

Ein Prototyp (engl. Prototype) ist ein Entwurfsmuster (design pattern) aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Erzeugungsmuster (Creational Patterns). Neue Instanzen werden aufgrund prototypischer Instanzen („Vorlagen“) erzeugt. Dabei wird die Vorlage kopiert und an neue Bedürfnisse angepasst. Das Muster ist eines der sogenannten GoF-Muster (Gang of Four, siehe Viererbande).

Inhaltsverzeichnis

Verwendung

Ein Prototyp findet Anwendung, wenn die Erzeugung weiterer Instanzen einer Klasse teuer ist und sich die Objekte ähneln, die zu instanziierenden Klassen erst zur Laufzeit bekannt sind, eine Hierarchie von Fabriken parallel zu einer Hierarchie von Produkten vermieden werden soll oder wenn die Objekte einer Klasse nur wenige Zustandskombinationen annehmen können; oder wenn die Bearbeitung von Vorlagen sehr ähnlich oder gleich der von Objekten ist.

UML-Diagramm

Das folgende Klassendiagramm zeigt die am Entwurfsmuster beteiligten Rollen. Der Client ruft die Methode klone des Prototyps zweimal auf und bekommt zwei unterschiedliche Objekte namens KonkreterPrototyp1 und KonkreterPrototyp2 zurück.

Klassendiagramm, das die am Entwurfsmuster beteiligten Rollen zeigt.

Akteure

Der Prototyp definiert eine Schnittstelle zur Kopie eines Objektes. Der KonkretePrototyp kopiert sich selbst durch Implementation der Schnittstelle. Man unterscheidet als Extremfälle zwischen flacher Kopie (Shallow Cloning) und tiefer Kopie (Deep Cloning). Ersteres lässt Verweise auf andere Objekte stehen, zweiteres kopiert auch die referenzierten Objekte. I. d. R. wird eine tiefe Kopie eines Prototyps hergestellt (außer für nicht-modifizierbare Objekte), die genauen Details müssen aber von Fall zu Fall geklärt werden.

Der Klient erzeugt neue Objekte als Kopie bestehender Objekte und modifiziert sie.

Anmerkung: Die Verwendung einer clone()-Methode ist nicht gleichbedeutend mit der Anwendung eines Prototyp-Musters. Im Prototyp-Muster wird konzeptuell zwischen den Prototypen und den (Nutz-)Objekten unterschieden, es dient also nicht jedes Objekt (einer Klassenhierarchie) als Prototyp. Daher soll beim Kopieren des Prototyps zum Zwecke der Objekterzeugung auch zumindest das "Status=Prototyp"-Flag (o.ä.) verändert werden, und daher gilt nicht mehr, dass der Prototyp gleich dem erzeugten Objekt ist. Sinnvollerweise wird dafür eine eigene Instantiate-Methode oder eine Clone-Methode mit Parameter verwendet.

Vorteile

Komplexe Objekte lassen sich schneller erzeugen. Neue Unterklassen können zur Laufzeit eingebunden werden. Neue Objekte können durch Variation der Struktur spezifiziert werden. Es gibt keine Erzeuger-Klassenhierarchie parallel zur Klassenhierarchie der Produkte.

Nachteile

Die Erstellung einer Kopie eines Objektes kann aufwendig sein. Jede Unterklasse muss die Kopie-Operation implementieren. Eventuelle Initialisierungen des kopierten Objekts müssen zusätzlich erfolgen.

Verwendung in der Dokumentenverarbeitung

In der Dokumentenverarbeitung (z.B. Microsoft Office, LibreOffice) ist das Prototyp-Muster Standard: Die Vorlagen werden mit denselben Tools wie die eigentlichen Dokumente bearbeitet; zum Erstellen eines Dokuments wird eine Vorlage kopiert und dann weiterbearbeitet. Oft gibt es eine Standard-Vorlage (z.B. "Normal.dot"), die als minimaler Prototyp für Objekte oder andere Vorlagen dienen kann.

Beispiel

Im JDK wird das Prototyp-Muster nicht explizit verwendet; nur bei der Klasse javax.swing.text.EditorKit ist angeführt, dass neue Instanzen durch Klonen einer anderen Instanz erzeugt werden sollen. Viele Klassen im JDK implementieren allerdings eine public-clone()-Methode, die prinzipiell als Grundlage eines Prototyp-Patterns verwendet werden kann.

Implementierung in C#

In .NET bietet die Basisklasse System.Object die geschützte (protected) Methode MemberwiseClone(), die eine flache Kopie des Objekts erzeugt, d.h. wertbehaftete Typen (int, decimal, etc.) werden byteweise 1 zu 1 kopiert, bei Referenzen wird nur der Referenzzeiger kopiert und nicht das Objekt selbst, auf das die neue Referenz zeigt. Um das Muster für einen Klienten nutzbar zu machen, muss der Prototyp noch das Interface ICloneable mit der Methode Clone() implementieren:

using System;
using System.Text;
 
namespace Prototype
{ 
    abstract class Prototype<T> where T : Prototype<T>
    {
        public T Clone()
        {
            return (T)this.MemberwiseClone();
        }
 
        public abstract void Print();
        public abstract int X { get; set; }
    }
 
    class ConcretePrototype : Prototype<ConcretePrototype>
    {
        public ConcretePrototype(int x) { X = x; }
        public override void Print()
        {
            Console.WriteLine(X);
        }
 
        public override int X { get; set; }
    }
 
    class Client
    {
        static void Main(string[] args)
        {
            int num = 1000;
            ConcretePrototype tempProt = null;
            ConcretePrototype prot = new ConcretePrototype(num);
 
            for (int i = 0; i < 10; i++)
            {
                tempProt = prot.Clone();
                tempProt.X *= i;
                tempProt.Print();
            }
        }
    }
}

Verwandte Entwurfsmuster

Einerseits konkurrieren abstrakte Fabrik und Prototyp miteinander, weil sie beide unterschiedliche Arten von Objekten erzeugen können. Andererseits lassen sie sich miteinander kombinieren, wenn eine abstrakte Fabrik Prototypen erzeugt, die dann anschließend ohne Zuhilfenahme einer Fabrik geklont werden können.

Kompositum und Decorator werden häufig gemeinsam mit Prototypen verwendet.

Weblinks

Prototype Pattern (englisch)


Wikimedia Foundation.

Игры ⚽ Поможем сделать НИР

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Prototyp — (engl. Prototype) (von griechisch τò πρωτότυπον, „das Urbild“) bezeichnet: Prototyp (Technik), ein Vorab Exemplar einer späteren Serienfertigung, das zur Erprobung von Eigenschaften dient Prototyp (Motorsport), ein speziell für den Rennsport …   Deutsch Wikipedia

  • Entwurfsmuster — (engl. design patterns) sind bewährte Lösungsschablonen für wiederkehrende Entwurfsprobleme in Softwarearchitektur und Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem bestimmten… …   Deutsch Wikipedia

  • Entwurfsmuster (Buch) — Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software, ISBN 3 8273 2199 9 (Originaltitel: Design Patterns. Elements of Reusable Object Oriented Software.) ist ein 1994 von Erich Gamma, Richard Helm, Ralph Johnson und John… …   Deutsch Wikipedia

  • Einzelstück (Entwurfsmuster) — Das Singleton (auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster (engl. Creational Patterns). Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt… …   Deutsch Wikipedia

  • Beobachter (Entwurfsmuster) — Der Observer (Beobachter, Listener) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Verhaltensmuster (Behavioural Patterns). Es dient zur Weitergabe von Änderungen an einem Objekt an von diesem… …   Deutsch Wikipedia

  • Builder (Entwurfsmuster) — Der Erbauer (englisch Builder) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Erzeugungsmuster (Creational Patterns). Es trennt die Konstruktion komplexer Objekte von deren Repräsentationen, wodurch… …   Deutsch Wikipedia

  • Facade (Entwurfsmuster) — Fassade (engl. facade) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural Patterns). Es bietet eine einheitliche und meist vereinfachte Schnittstelle zu einer Menge von… …   Deutsch Wikipedia

  • Proxy (Entwurfsmuster) — Der Proxy, auch Stellvertreter genannt, ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural Patterns). Das Muster dient zum Verschieben der Kontrolle über ein Objekt auf ein… …   Deutsch Wikipedia

  • Bridge (Entwurfsmuster) — Eine Brücke (engl. Bridge) ist in der Softwareentwicklung ein Entwurfsmuster und gehört zur Kategorie der Strukturmuster (Structural Patterns). Das Muster dient zur Trennung der Implementierung von ihrer Abstraktion (Schnittstelle), wodurch beide …   Deutsch Wikipedia

  • Composite (Entwurfsmuster) — Das Kompositum (engl. Composite) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural Patterns). Es wird angewendet um Teil Ganzes Hierarchien zu repräsentieren, indem Objekte… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”