Abstract Factory (fabryka abstrakcyjna)

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

Builder (budowniczy) Cel: Przykład:

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

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

Technologia Programowania 2016/2017 Wykład 5

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

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

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

Wykład 7: Pakiety i Interfejsy

Wzorce projektowe. dr inż. Marcin Pietroo

Command (action, transaction, polecenie)

Projektowanie obiektowe Wzorce projektowe

PHP 5 język obiektowy

Klasy abstrakcyjne, interfejsy i polimorfizm

Dokumentacja do API Javy.


Programowanie obiektowe

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

Aplikacje RMI Lab4

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wzorce projektowe. Wstęp

Template method (metoda szablonowa)

Wywoływanie metod zdalnych

Przykład -

Remote Method Invocation 17 listopada 2010

Przykładowa implementacja

Decorator (dekorator)

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

Wywoływanie metod zdalnych

Programowanie obiektowe i zdarzeniowe

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

Java: interfejsy i klasy wewnętrzne

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

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

Aplikacje RMI

Programowanie bez fabryki. Po co używać wzorca fabryki?

Metody Metody, parametry, zwracanie wartości

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

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

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

Klasy abstrakcyjne i interfejsy

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ć

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

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

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

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

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

KLASY, INTERFEJSY, ITP

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

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

Aplikacje w środowisku Java

Wzorce oprogramowania Gof. zastosowane w modelu obiektowym

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

UML a kod. C++, Java i C#

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

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

Wzorce logiki dziedziny

Fragmenty są wspierane od Androida 1.6

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe

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

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Wykład 4: Klasy i Metody

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

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

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Programowanie obiektowe

Wykład 6: Dziedziczenie

Tomasz Dobek.

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Systemy Rozproszone - Ćwiczenie 6

Programowanie obiektowe

Kurs WWW. Paweł Rajba.

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

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

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Programowanie obiektowe

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

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Laboratorium 8 Diagramy aktywności

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

Zaawansowane programowanie w C++ (PCP)

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Podstawy programowania III

Interfejsy w Javie. Przykład zastosowania interfejsów:

Programowanie obiektowe

Kontenery IoC dla Java Guice 3.0

Programowanie obiektowe

Transkrypt:

1/9 Abstract Factory (fabryka abstrakcyjna) Cel: Zapewnienie interfejsu do tworzenia rodzin powiązanych obiektów bez specyfikacji konkretnej klasy. Przykład: Aplikacja do ustawiania mebli: osobne rodziny produktów: klas 2D i 3D

2/9 abstract class Szafka { /*... */ class Szafka2D extends Szafka { /*... */ class Szafka3D extends Szafka { /*... */ abstract class Ściana { /*... */ class Ściana2D extends Ściana { /*... */ class Ściana3D extends Ściana { /*... */ class Client { public static void main(string[] args) { if(tryb == Tryb.2D) { model.add(new Ściana2D(...)); else if (tryb == Tryb.3D) { model.add(new Ściana3D(...));

Struktura: Składniki: AbstractFactory deklaruje interfejs tworzenia abstrakcyjnych produktów Factory1, Factory2 implementują operacje tworzenia konkretnego produktu AbstractProduct deklaruje interfejs rodzaju produkowanych obiektów Product* implementują interfejs AbstractProduct, definiują rodzaj produktu Client używa wyłącznie interfejsu AbstractFactory i AbstractProduct 3/9

Zależności: Zazwyczaj w trakcie działania programu tworzona jest pojedyncza instancja ConcreteFactory. Tworzy ona obiekty produktów określonego rodzaju. Aby tworzyć inny typ obiektów, należy użyć innej fabryki. AbstractFactory oddelegowuje zadanie tworzenia produktów do potomnych klas konkretnych fabryk. abstract class AbstractFactory { public abstract AbstractProductA createproducta(); public abstract AbstractProductB createproductb(); class Factory1 extends AbstractFactory { public AbstractProductA createproducta() { return new ProductA1(); public AbstractProductB createproductb() { return new ProductB1(); class Factory2 extends AbstractFactory { public AbstractProductA createproducta() { return new ProductA2(); public AbstractProductB createproductb() { return new ProductB2(); 4/9

class Client { public static void main(string[] args) { AbstractFactory factory; if(/*... */) factory = new Factory1(); else factory = new Factory2(); AbstractProductA pa = factory.createproducta(); AbstractProductB pb = factory.createproductb(); model.adda(factory.createproducta()); model.addb(factory.createproductb()); Zastosowanie: Gdy system nie powinien zależeć od tego w jaki sposób jego produkty są tworzone, składane i reprezentowane Gdy system może być skonfigurowany z jedną z kilku rodzin produktów Gdy produkty są tak zaprojektowane, by używać ich razem (czyli tylko produkty z jednej rodziny) Gdy chcemy dostarczyć bibliotekę produktów i udostępniać tylko ich interfejsy, nie implementację 5/9

6/9 Konsekwencje: 1. izoluje konkretne klasy ich nazwy nie są widoczne w kodzie klienta, gdyż ich tworzeniem zajmuje się konkretna fabryka; 2. ułatwia wymianę rodziny produktów aby użyć innej rodziny wymieniamy tylko konkretną fabrykę, która przeważnie pojawia się tylko w jednym miejscu aplikacji; 3. wspomaga spójność między produktami niekiedy produkty danej rodziny są pomyślane tak, by używać ich razem (czyli aplikacja powinna używać tylko produktów jednej rodziny) 4. dostarczenie nowego rodzaju produktów jest trudne musimy rozszerzyć interfejs fabryki, czyli zmienić AbstractFactory i wszystkie potomne; Implementacja: 1. fabryka jako Singleton zazwyczaj potrzebujemy tylko jednej instancji fabryki 2. tworzenie produktu abstrakcyjna fabryka deklaruje tylko interfejs do tworzenia produktów, ich stworzenie jest zadaniem konkretnych fabryk najczęściej robi się to definiując factory method dla każdego produktu, co wymaga nowej fabryki dla każdej rodziny produktów; 3. definiowanie rozszerzalnych fabryk aby nie mieć odrębnej operacji dla każdego produktu można użyć jednej metody z parametrem oznaczającym rodzaj produktu; jest to używane w fabrykach typu prototyp; produkty muszą mieć wspólny interfejs, albo klient będzie musiał je rzutować w dół;

7/9 abstract class AbstractFactory { public enum Type { szafka, ściana ; public public Object create(type type); class Factory2D extends AbstractFactory { public Object create(type type) { switch(type) { case szafka: return new Szafka2D(); case ściana: return new Ściana2D(); throw new IllegalArgumentException(); //... Client AbstractFactory factory = new Factory2D(); Szafka sz = (Szafka)factory.create(AbstractFactory.Type.szafka);

8/9 Inny przykład: interface Window { interface Label { interface Button { //Abstract Factory inteface GUIEnv { Window getwindow(); Label getlabel(string text); Button getbutton(string text); //Windows Factory class WindowsGUI implements GUIEnv{ public Window getwindow() { return new Windows.Frame(); public Label getlabel(string text) { return new Windows.TextBlock(text); public Button getbutton(string text) { return new Windows.PressButton(text);

9/9 //My Factory class MyGUI implements GUIEnv{ public Window getwindow() { return new MyDialogWindow(); public Label getlabel(string text) { return new MyIcon(new Text(text)); public Button getbutton(string text) { return new MyButton(new MyIcon(new Text(text))); // Client GUIEnv factory = new MyGUI(); Window window = factory.getwindow() window.add(factory.getlabel("hello")); window.add(factory.getbutton("ok")); window.add(factory.getbutton("anuluj")); Powiązania: AbstractFactory przeważnie implementowana z użyciem Factory Method, może korzystać z Prototypów, przeważnie jest Singletonem