320 likes | 399 Views
Software Design Patterns. Prototype. Aufgabe : Erzeugungsmuster (Creational Pattern). Gültigkeitsbereich : objektbasierend. Zweck : Bestimme die Arten zu erzeugender Objekte durch die Verwendung eines prototypischen Exemplars und erzeuge neue Objekte durch Kopieren dieses Prototypen.
E N D
Software Design Patterns Prototype
Aufgabe: Erzeugungsmuster (Creational Pattern) Gültigkeitsbereich: objektbasierend
Zweck: Bestimme die Arten zu erzeugender Objekte durch die Verwendung eines prototypischen Exemplars und erzeuge neue Objekte durch Kopieren dieses Prototypen.
Motivation: • Das Erzeugen einer Instanz einer Klasse ist sehr zeitraubend oder komplex. • Es werden Kopien der original Instanz erzeugt und abgeändert.
Anwendbarkeit: • System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden
Anwendbarkeit: • System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden • Klassen werden erst zur Laufzeit spezifiziert
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
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
Konsequenzen: • versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder)
Konsequenzen: • versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder) • Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten
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
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
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
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
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
Implementierung: • statisch typisierten Programmiersprachen wie C++
Implementierung: • statisch typisierten Programmiersprachen wie C++ • Verwendung von Prototypenverwalter
Implementierung: • statisch typisierten Programmiersprachen wie C++ • Verwendung von Prototypenverwalter • Implementierung der Clone()-Operation • „shallow copy“ – „deep copy“
Implementierung: • statisch typisierten Programmiersprachen wie C++ • Verwendung von Prototypenverwalter • Implementierung der Clone()-Operation • „shallow copy“ – „deep copy“ • Initialisierung geklonter Objekte
Beispielcode: class Swimmer { String name; int age; String club; float time; boolean female; }
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(); }
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()); }
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
Beispielcode: Geklonte Liste in GUI anzeigen: for(int i = 0; i< sxdata.size(); i++) { sw = sxdata.getSwimmer(i); cloneList.addItem(sw.getName()+” “+sw.getTime()); }
Beispielcode: Nach „Clone“
Beispielcode: Nach „Refresh“:
Verwandte Muster: • Abstrakte Fabrikmuster (Abstract Factory) • Kompitions- und Dekorierermuster • (Composite, Decorator)
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
Internetquellen: • http://www.fh-wedel.de/~si/seminare/ws97/Ausarbeitung/2.Winter/gamma10.htm • http://home.earthlink.net/~huston2/dp/prototype.html • www2.informatik.uni-erlangen.de/Lehre/SS01/XML/Docs/Erzeugungsmuster.pdf • Catalog of Non-Software Examples of Design Patterns: • http://www.agcs.com/supportv2/techpapers/patterns/papers/tutnotes/