Builder (budowniczy) Cel: Przykład:

Podobne dokumenty
Abstract Factory (fabryka abstrakcyjna)

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

Wzorce projektowe. dr inż. Marcin Pietroo

Wzorce projektowe. Wstęp

Programowanie obiektowe

Dokumentacja do API Javy.

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Template method (metoda szablonowa)

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

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

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

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

Klasy abstrakcyjne, interfejsy i polimorfizm

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

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

Metody Metody, parametry, zwracanie wartości

Podstawy programowania obiektowego

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Enkapsulacja, dziedziczenie, polimorfizm

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

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

Decorator (dekorator)


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

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

Programowanie obiektowe

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

Programowanie obiektowe

PHP 5 język obiektowy

Programowanie obiektowe i zdarzeniowe

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

Zaawansowane programowanie w C++ (PCP)

Technologia Programowania 2016/2017 Wykład 5

Aplikacje w środowisku Java

Projektowanie obiektowe Wzorce projektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Command (action, transaction, polecenie)

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

Wykład 8: klasy cz. 4

Klasy abstrakcyjne i interfejsy

Przykładowa implementacja

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

Modelowanie obiektowe

Kurs WWW. Paweł Rajba.

problem w określonym kontekście siły istotę jego rozwiązania

Wykład 7: Pakiety i Interfejsy

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

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

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

Wywoływanie metod zdalnych

Polimorfizm. dr Jarosław Skaruz

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Szablony klas, zastosowanie szablonów w programach

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

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Wykład 6: Dziedziczenie

Java: interfejsy i klasy wewnętrzne

Diagramy klas. dr Jarosław Skaruz

Laboratorium 8 Diagramy aktywności

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

Programowanie i struktury danych

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

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Technologie i usługi internetowe cz. 2

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)

Zaawansowane programowanie obiektowe - wykład 5

Podstawy projektowania systemów komputerowych

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie Obiektowe GUI

Aplikacje RMI

Wzorce projektowe kreacyjne

Podstawy Programowania Obiektowego

Diagram stanów Laboratorium 9

Programowanie obiektowe

C++ Przeładowanie operatorów i wzorce w klasach

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Podstawy i języki programowania

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Wywoływanie metod zdalnych

Wzorce projektowe. dr inż. Marcin Pietroo

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

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Tworzenie elementów graficznych

Interfejsy i klasy wewnętrzne

Wykład 5: Klasy cz. 3

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

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Materiały do zajęć VII

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Listy powiązane zorientowane obiektowo

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

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Zaawansowane aplikacje WWW - laboratorium

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Transkrypt:

1/8 Builder (budowniczy) Cel: Oddzielenie konstruowania złożonego obiektu od jego reprezentacji, tak aby ten sam proces konstrukcji mógł tworzyć różne reprezentacje. Przykład:

2/8 abstract class TableBuilder { public abstract void addrow(); public abstract void addcol(); class TableBuilderHTML extends TableBuilder { public void addrow() { /*... */ public void addcol() { /*... */ public String gettable() { /*... */ //... Client builder = new TableBuilderHTML(); builder.addrow(); //... builder.addcol(); //... //... String table = builder.gettable(); Zastosowanie: Gdy algorytm tworzenia złożonego obiektu powinien być niezależny od części, które składają się na ten obiekt i sposobu ich składania Gdy proces konstrukcji powinien pozwalać na różne reprezentacje tworzonego obiektu

3/8 Struktura: Składniki: Builder deklaruje abstrakcyjny interfejs tworzenia części produktu ConcreteBuilder tworzy i składa części produktu, implementując interfejs Buildera; definiuje i przechowuje tworzoną reprezentację produktu; udostępnia interfejs pozwalający na odebranie stworzonego produktu Director konstruuje obiekt przy pomocy interfejsu Buildera Product reprezentuje złożony obiekt, który konstruujemy; wewnętrzną reprezentację produktu definiuje ConcreteBuilder, on też definiuje proces jego składania; product przeważnie składa się z klas reprezentujących jego części składowe

4/8 Zależności: Klient tworzy obiekt Directora i konfiguruje go konkretnym rodzajem Buildera. Director kieruje do Buildera żądania tworzenia kolejnych części produktu. Builder wykonuje te żądania: tworzy części i do daje je do produktu. Klient odbiera od Buildera gotowy produkt. class Director { public Director(TableBuilder builder) { /*... */ public void createtable(int rows, int cols) { for(int i = 0; i < rows; ++i) builder.addrow(); for(int i = 0; i < cols; ++i) builder.addcol(); //... Client TableBuilderSwing builder = new TableBuilderSwing(); Director director = new Director(builder); director.createtable(5, 3); JComponent table = builder.getresult();

5/8

Konsekwencje: 1. umożliwia zmianę wewnętrznej reprezentacji produktu builder dostarcza directorowi abstrakcyjny interfejs do tworzenia produktu, ukrywając przed nim reprezentację i wewnętrzną strukturę, oraz to, w jaki sposób jest on składany; aby zmienić wewnętrzną reprezentację produktu wystarczy zdefiniować nowy rodzaj buildera; 2. izoluje kod konstrukcji i reprezentacji poprawia modularność hermetyzując sposób tworzenia złożonego obiektu klient nie musi wiedzieć jakie klasy tworzą wewnętrzną strukturę produktu, gdyż nie są one widoczne w interfejsie buildera; każdy konkretny builder zawiera cały kod potrzebny do stworzenia i złożenia danego rodzaju produktu, director może używać raz napisanego kodu do konstrukcji innych wariantów produktu z tych samych kawałków; 3. daje bardziej precyzyjną kontrolę nad procesem konstrukcji w przeciwieństwie do wzorców tworzących produkt w jednym ruchu, builder tworzy go krok po kroku, pod kontrolą directora produkt jest zwracany dopiero po skończeniu produkcji, zatem interfejs buildera lepiej przedstawia proces tworzenia obiektu i daje nad nim pełniejszą kontrolę; Implementacja: Zazwyczaj mamy abstrakcyjnego buildera, który definiuje operację dla każdego komponentu, o którego stworzenie może prosić director (domyślnie pustą) konkretny builder przesłania operacje tworzące interesujące go komponenty. A poza tym: 6/8

1. interfejs tworzenia i składania jak konstruować produkty? tworzymy je krok po kroku, zatem interfejs buildera musi być wystarczająco uniwersalny, by pozwolić na tworzenie produktów wszystkim rodzajom konkretnych builderów; czasem wystarczy po kolei tworzyć kolejne fragmenty i składać je ze sobą (np. tekst formatowany), wtedy interfejs tworzenia produktu jest prosty, ale czasem potrzebujemy odwołań do części już stworzonych (grafy, drzewa) wówczas builder będzie zwracał jakieś węzły dla directora, a ten przekaże je dalej w kolejnych wywołaniach; class TreeBuilder { public Node addnode(node parent, String text) { Node node = new Node(); node.text = text; node.parent = parent; return node; class TreeDirector { private TreeBuilder builder; public TreeDirector(TreeBuilder b) { builder = b; public void construct() { Node root = builder.addnode(null, "root"); builder.addnode(root, "A"); builder.addnode(root, "B"); builder.addnode(root, "C"); 7/8

2. dlaczego nie ma abstrakcyjnej klasy produktu? gdyż konkretne produkty różnią się tak bardzo, że nic byśmy nie zyskali dając im wspólny interfejs; ponieważ to klient konfiguruje directora konkretnym builderem, wie on który builder jest w użyciu i jak się nim zająć poprawnie; class WindowBuilderGUI extends WindowBuilder { public void addbutton( /*... */ ) { /*... */ public void addlabel( /*... */ ) { /*... */ public JFrame getproduct() { /*... */ class WindowBuilderImage extends WindowBuilder { public void addbutton( /*... */ ) { /*... */ public void addlabel( /*... */ ) { /*... */ public Image getproduct() { /*... */ 3. domyślnie puste metody w builderze (a nie abstrakcyjne) aby klient mógł przesłonić tylko te operacje, których potrzebuje; Powiązania: Abstract Factory również może konstruować złożone produkty, ale Builder skupia się na ich tworzeniu krok-po-kroku, zaś Abstract Factory na wydzieleniu osobnych rodzin produktów. Builder zwraca produkt dopiero w ostatnim kroku produkcji. Builder zazwyczaj zajmuje się tworzeniem Kompozytów (Composite). 8/8