Harald Köbler hk018@hdm-stuttgart.de Software Design Patterns Prototype

Preview:

Citation preview

Harald Köbler

hk018@hdm-stuttgart.de

Software Design Patterns

Prototype

Harald Köbler

hk018@hdm-stuttgart.de

Aufgabe: Erzeugungsmuster (Creational Pattern)

Gültigkeitsbereich: objektbasierend

Harald Köbler

hk018@hdm-stuttgart.de

Zweck:

Bestimme die Arten zu erzeugender Objekte durch die Verwendung eines prototypischen Exemplars und erzeuge neue Objekte durch Kopieren dieses Prototypen.

Harald Köbler

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

Anwendbarkeit:

• System soll unabhängig davon sein, wie seine Produkte erzeugt, zusammengesetzt und repräsentiert werden

Harald Köbler

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

Struktur:

Harald Köbler

hk018@hdm-stuttgart.de

Konsequenzen:

• versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder)

Harald Köbler

hk018@hdm-stuttgart.de

Konsequenzen:

• versteckt konkrete Produktklassen von dem Client ( Abstract Factory, Builder)

• Client kann ohne Modifikation mit anwendungsspezifische Klassen arbeiten

Harald Köbler

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

Implementierung:

• statisch typisierten Programmiersprachen wie C++

Harald Köbler

hk018@hdm-stuttgart.de

Implementierung:

• statisch typisierten Programmiersprachen wie C++

• Verwendung von Prototypenverwalter

Harald Köbler

hk018@hdm-stuttgart.de

Implementierung:

• statisch typisierten Programmiersprachen wie C++

• Verwendung von Prototypenverwalter

• Implementierung der Clone()-Operation

„shallow copy“ – „deep copy“

Harald Köbler

hk018@hdm-stuttgart.de

Implementierung:

• statisch typisierten Programmiersprachen wie C++

• Verwendung von Prototypenverwalter

• Implementierung der Clone()-Operation

„shallow copy“ – „deep copy“

• Initialisierung geklonter Objekte

Harald Köbler

hk018@hdm-stuttgart.de

Beispielcode:

class Swimmer

{

String name;

int age;

String club;

float time;

boolean female;

}

Harald Köbler

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

Beispielcode:

Nach „Clone“

Harald Köbler

hk018@hdm-stuttgart.de

Beispielcode:

Nach „Refresh“:

Harald Köbler

hk018@hdm-stuttgart.de

Verwandte Muster:

• Abstrakte Fabrikmuster (Abstract Factory)

• Kompitions- und Dekorierermuster

(Composite, Decorator)

Harald Köbler

hk018@hdm-stuttgart.de

Prototype im nicht-Computerbereich:

Harald Köbler

hk018@hdm-stuttgart.de

Harald Köbler

hk018@hdm-stuttgart.de

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

hk018@hdm-stuttgart.de

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/

Recommended