Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Podobne dokumenty
Programowanie obiektowe

Abstract Factory (fabryka abstrakcyjna)

Builder (budowniczy) Cel: Przykład:

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Programowanie obiektowe

Command (action, transaction, polecenie)

Dokumentacja do API Javy.

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Kurs WWW. Paweł Rajba.

Zaawansowane programowanie w C++ (PCP)

Decorator (dekorator)

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Wywoływanie metod zdalnych

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wykład 6: Dziedziczenie

Wzorce projektowe. dr inż. Marcin Pietroo

Klasy abstrakcyjne, interfejsy i polimorfizm

Wywoływanie metod zdalnych

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Dziedziczenie. dr Jarosław Skaruz

Projektowanie obiektowe Wzorce projektowe

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

Aplikacje RMI

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Podstawy programowania obiektowego

Systemy Rozproszone - Ćwiczenie 6

Programowanie obiektowe

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Remote Method Invocation 17 listopada 2010

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wykład 7: Pakiety i Interfejsy

Języki i techniki programowania Ćwiczenia 2

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Dziedziczenie. Tomasz Borzyszkowski

Template method (metoda szablonowa)

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wzorce projektowe. dr inż. Marcin Pietroo

Aplikacje RMI Lab4

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Java: interfejsy i klasy wewnętrzne

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

PHP 5 język obiektowy

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

KLASY, INTERFEJSY, ITP

Wzorce projektowe. Wstęp

Polimorfizm. dr Jarosław Skaruz

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Aplikacje w środowisku Java

Diagramy klas. dr Jarosław Skaruz

Wykład 8: Obsługa Wyjątków

Technologia Programowania 2016/2017 Wykład 4

Programowanie obiektowe

Testowanie oprogramowania Wzorce projektowe

Wykład 4: Klasy i Metody

Współbieżność w środowisku Java

MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016


Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Programowanie obiektowe

Wstęp do programowania obiektowego. Wykład 2

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

Programowanie obiektowe i zdarzeniowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wykład 8: klasy cz. 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Java. Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe i zdarzeniowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń

Strumienie i serializacja

Programowanie obiektowe

Klasy abstrakcyjne i interfejsy

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Metody Metody, parametry, zwracanie wartości

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

Transkrypt:

1/14 Prototype (prototyp) Cel: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp. Przykład: Edytor 3D klient tworzy obiekty różnych kształtów

2/14 abstract class Shape { public void transform(affinetransformation af) { /*... */ class Cube extends Shape { /*... */ class Cone extends Shape { /*... */ class Sphere extends Shape { /*... */ class Application { public Application() { toolbox.add(new Icon("cube")); toolbox.add(new Icon("cone")); toolbox.add(new Icon("sphere")); public void action(icon ic) { if(ic.name.equals("cube")) scene.add(new Cube()); if(ic.name.equals("cone")) scene.add(new Cone()); if(ic.name.equals("sphere")) scene.add(new Sphere());

3/14 Rozwiązanie: abstract class Shape { public void transform(affinetransformation af) { /*... */ class Cube extends Shape { /*... */ class Cone extends Shape { /*... */ class Sphere extends Shape { /*... */ class Application { public Application() { toolbox.add(new Icon(new Cube())); toolbox.add(new Icon(new Cone())); toolbox.add(new Icon(new Sphere())); public void action(icon ic) { Shape nowy = ic.prototype.clone(); scene.add(nowy);

Struktura: Składniki: Prototype deklaruje interfejs klonowania ConcretePrototype implementuje operację klonowania samego siebie Client tworzy nowe obiekty prosząc prototyp o sklonowanie siebie Zależności: Klient prosi prototyp o zwrócenie swojej kopii. 4/14

5/14 Zastosowanie: Gdy system ma być uniezależniony od tego, w jaki sposób obiekty są tworzone, składane i reprezentowane, i: gdy klasy tworzonych obiektów są podawane w trakcie działania programu (np. przez dynamiczne ładowanie) aby zapobiec tworzeniu całej hierarchii klas fabryk równolegle do hierarchii klas produktów gdy instancje klasy mogą przyjmować jedynie jeden z niewielu stanów może wówczas lepiej będzie zrobić sobie odpowiednią liczbę prototypów i klonować je, zamiast tworzyć klasy ręczne wszędzie tam, gdzie ich potrzebujemy? Konsekwencje: Ukrywa przed klientem konkretną klasę produktu (zatem: mniej nazw, o których musi on wiedzieć), wymiana klas bez angażowania klienta. A poza tym: 1. dodawanie i usuwanie produktów w trakcie wykonania programu dołączenie nowej klasy produktu polega tylko na zarejestrowaniu jego prototypu 2. definiowanie nowych obiektów przez zmianę wartości nowe zachowania możemy definiować przez kompozycję (np. ustawiając wartości zmiennych), a nie definiowanie nowych klas. Rejestrujemy stworzone i odpowiednio sparametryzowane instancje klas jako prototypy, w ten sposób nawet użytkownik może definiować nowe klasy

6/14 3. definiowanie nowych obiektów przez zmianę struktury obiekty mogą składać się z części, np. układ cyfrowy w odpowiednim edytorze; możemy pozwolić użytkownikowi zdefiniować jego układ jako prototyp na równi z naszymi toolbox.add(new Cube()); toolbox.add(new Cone()); toolbox.add(new Shape(new Vertex(0.0, 1.0, 0.0), new Vertex(1.0, 1.0, 1.0),...)); toolbox.add(new Shape(new Face(...),new Face(...),...)); toolbox.add(new Shape(new File("Pyramid.shp"))); 4. mniej dziedziczenia Factory Method zazwyczaj produkuje hierarchię kreatorów równoległą do hierarchii produktów, prototyp w ogóle nie wymaga kreatorów; doceniane zwłaszcza w C++, bo np. Java ma klasę Class, która sama może działać jak prototyp i służyć jako kreator/prototyp: Class prototyp = Cube.class; Shape sh; try { sh = (Shape)prototype.newInstance(); catch(exception ex) { sh = null; scene.add(sh);

7/14 5. Najpoważniejszym minusem jest konieczność implementacji metody Clone w każdej podklasie prototypu, co może być trudne np. gdy te klasy już istnieją i/lub zawierają obiekty które nie wspomagają klonowania lub zawierają cykliczne referencje. Implementacja: 1. menadżer prototypów ilość prototypów w systemie nie jest ustalona i może zmieniać się dynamicznie klient nie będzie wówczas musiał sam się nimi zajmować, a jedynie pobierał je z rejestru, gdzie są składowane; menadżer prototypów pozwala na rejestrowanie prototypu pod określoną nazwą-kluczem, wyrejestrowywanie, przeglądanie, zamianę, etc.

8/14 class Manager { private HashMap<String, Prototype> map = new HashMap<String, Prototype>(); public void register(string name, Prototype p) { // usuwa poprzedniego o tej samej nazwie map.put(name, p); public void unregister(string name, Prototype p) { map.remove(name); public Prototype createnew(string name) { return map.get(name).clone(); Manager manager = new Manager(); manager.register("cube", new Cube()); manager.register("cone", new Cone()); scene.add(manager.createnew("cube"));

9/14 2. implementacja operacji clone może być trudnym zadaniem, zwłaszcza przy złożonych obiektach o cyklicznych referencjach; problemu kopii płytkiej/ głębokiej: niekiedy płytka wystarcza, ale klonując prototypy o skomplikowanej strukturze oczekujemy kopii głębokiej class Prototype implements Cloneable { private int a; private double b; public Object clone() throws CloneNotSupportedException { return super.clone(); Prototype prototyp =... try { Prototype nowy = (Prototype)prototyp.clone(); catch(clonenotsupportedexception ex) {

class Prototype implements Cloneable { private int a; private double b; public Prototype clone() { Prototype p = null; try { p = (Prototype)super.clone(); catch(clonenotsupportedexception e) { return p; Prototype prototyp =... Prototype nowy = prototyp.clone(); 10/14

11/14 uwaga na kopię płytką! class Prototype implements Cloneable { private Object a; private double[] b; public Prototype clone() { /*... */ public String tostring() { return super.tostring() + "(" + a + "," + b + ")"; Prototype prototyp =... Prototype nowy = prototyp.clone(); System.out.println(prototyp); System.out.println(nowy);

class Prototype implements Serializable{ private Object a; private double[] b; public Prototype clone() { Prototype p = null; try { ByteArrayOutputStream bufor = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bufor); out.writeobject(this); out.close(); ObjectInputStream in = new ObjectInputStream( new ByteArrayInputStream( bufor.tobytearray())); p = (Prototype)in.readObject(); in.close(); catch(exception ex) { return p; Prototype prototyp =... Prototype nowy = prototyp.clone(); 12/14

13/14 3. inicjalizacja klonów czasem wystarczy nam stworzenie klonu z wartościami skopiowanym z prototypu, ale niekiedy klient oczekuje własnej inicjalizacji jego składowych; nie możemy przekazać tych wartości jako parametru w Clone, bo ich liczba może być różna w różnych klasach; jeśli już mamy jakieś operacje do ustawiania stanu, klient musi je wywołać tuż po sklonowaniu prototypu, jeśli nie, możemy stworzyć operację Initialize, która będzie przyjmować odpowiednie argumenty i ustawiać początkowy stan obiektu; uwaga: być może wykonana wcześniej kopia głęboka będzie znikać podczas reinicjalizacji Shape nowy = toolbox.get("cube").clone(); nowy.place(0.0, 2.0, -1.0); Powiązania: Jeśli korzystamy ze złożonych wzorców strukturalnych, np. Composite lub Decorator, wzorzec Prototype pozwala nam uprościć proces ich konstrukcji. Wzorce Prototype i Abstract Factory są konkurencyjne względem siebie często tę samą rzecz możemy osiągnąć przy użyciu dowolnego z nich. Niekiedy mogą być też użyte razem np. Abstract Factory może składować prototypy produktów do utworzenia

class Factory { private AbstractŚciana prototype_s; public Factory(AbstractŚciana s, AbstractSzafka sz) { prototype_s = s;... public AbstractŚciana createściana() { return prototype_s.clone(); //... //...Client... Factory factory = new Factory(new Ściana2D(), new Szafka2D()); model.add(factory.createściana()); model.add(factory.createściana()); model.add(factory.createszafka()); //... 14/14