Harald Köbler Software Design Patterns Prototype
Harald Köbler Aufgabe: Erzeugungsmuster (Creational Pattern) Gültigkeitsbereich: objektbasierend
Harald Köbler Zweck: Bestimme die Arten zu erzeugender Objekte durch die Verwendung eines prototypischen Exemplars und erzeuge neue Objekte durch Kopieren dieses Prototypen.
Harald Köbler Motivation: Das Erzeugen einer Instanz einer Klasse ist sehr zeitraubend oder komplex. Es werden Kopien der original Instanz erzeugt und abgeändert.
Harald Köbler Anwendbarkeit: System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden
Harald Köbler Anwendbarkeit: System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden Klassen werden erst zur Laufzeit spezifiziert
Harald Köbler Anwendbarkeit: System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden Klassen werden erst zur Laufzeit spezifiziert parallele Klassenhierarchien vermeiden
Harald Köbler Anwendbarkeit: System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden Klassen werden erst zur Laufzeit spezifiziert parallele Klassenhierarchien vermeiden Exemplare einer Klasse haben nur wenige Zustandskombinationen
Harald Köbler Struktur:
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder)
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten Hinzufügen und entfernen von Produkten zur Laufzeit
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten Hinzufügen und entfernen von Produkten zur Laufzeit Spezifikation neuer Objekte durch Variation von Werten
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten Hinzufügen und entfernen von Produkten zur Laufzeit Spezifikation neuer Objekte durch Variation von Werten Spezifikation neuer Objekte durch Variation der Struktur
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten Hinzufügen und entfernen von Produkten zur Laufzeit Spezifikation neuer Objekte durch Variation von Werten Spezifikation neuer Objekte durch Variation der Struktur Verringerte Unterklassenbildung
Harald Köbler Konsequenzen: versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten Hinzufügen und entfernen von Produkten zur Laufzeit Spezifikation neuer Objekte durch Variation von Werten Spezifikation neuer Objekte durch Variation der Struktur Verringerte Unterklassenbildung Wichtig: jede Unterklasse von Prototype muss die Operation Clone() implementieren
Harald Köbler Implementierung: statisch typisierten Programmiersprachen wie C++
Harald Köbler Implementierung: statisch typisierten Programmiersprachen wie C++ Verwendung von Prototypenverwalter
Harald Köbler Implementierung: statisch typisierten Programmiersprachen wie C++ Verwendung von Prototypenverwalter Implementierung der Clone()-Operation shallow copy – deep copy
Harald Köbler Implementierung: statisch typisierten Programmiersprachen wie C++ Verwendung von Prototypenverwalter Implementierung der Clone()-Operation shallow copy – deep copy Initialisierung geklonter Objekte
Harald Köbler Beispielcode: class Swimmer { String name; int age; String club; float time; boolean female; }
Harald Köbler Beispielcode: public class SwimData implements Cloneable { Vector swimmers; public SwimData(String filename) { String s = ""; swimmers = new Vector(); //open data file InputFile f = new InputFile(filename); s= f.readLine(); //read in and parse each line while(s != null) { swimmers.addElement(new Swimmer(s)); s= f.readLine(); } f.close(); }
Harald Köbler Beispielcode: Liste in GUI anzeigen: swList.removeAll(); //clear list for (int i = 0; i < sdata.size(); i++) { sw = sdata.getSwimmer(i); swList.addItem(sw.getName()+" "+sw.getTime()); }
Harald Köbler Beispielcode: Liste in GUI anzeigen: swList.removeAll(); //clear list for (int i = 0; i < sdata.size(); i++) { sw = sdata.getSwimmer(i); swList.addItem(sw.getName()+" "+sw.getTime()); } sxdata = (SwimData)sdata.clone(); sxdata.sortByTime(); // re-sort cloneList.removeAll(); // clear list
Harald Köbler Beispielcode: Geklonte Liste in GUI anzeigen: for(int i = 0; i< sxdata.size(); i++) { sw = sxdata.getSwimmer(i); cloneList.addItem(sw.getName()+ +sw.getTime()); }
Harald Köbler Beispielcode: Nach Clone
Harald Köbler Beispielcode: Nach Refresh:
Harald Köbler Verwandte Muster: Abstrakte Fabrikmuster (Abstract Factory) Kompitions- und Dekorierermuster (Composite, Decorator)
Harald Köbler Prototype im nicht-Computerbereich:
Harald Köbler
Harald Köbler Literaturquellen: Design Patterns, AW-Verlag Gamma, Helm, Johnson, Vlissides Entwurfsmuster, AW-Verlag Übersetzt Dirk Riehle The Design Patterns – Java Companion AW-Verlag, James W. Cooper
Harald Köbler Internetquellen: www2.informatik.uni-erlangen.de/Lehre/SS01/XML/Docs/Erzeugungsmuster.pdf Catalog of Non-Software Examples of Design Patterns: