Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“

Podobné prezentace


Prezentace na téma: "Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“"— Transkript prezentace:

1 Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“

2 Obecné Vlastnosti Cíle vytváří objekty po částech řeší pořadí
účel je řídit process, ne získat produkt Cíle vytvořit různé reprezentace podobným postupem zjednodušit rozšiřitelnost do budoucnosti přehledný zdrojový kód

3 Struktura Director Builder ConcreteBuilder Product řídí proces
používá Builder a po krocích vytvoří objekt Builder definuje rozhrání ConcreteBuilder implementuje rozhrání Builderu definuje proces tvorby dané části Product reprezentuje vytvořený objekt

4 Sequence diagram Klient vytvoří Director a konfiguruje ho ConcreteBuilderem Director požádá ConcreteBuildera o vytvoření části výsledného objektu Klient získá vytvořený objekt od ConcreteBuilderu

5 Příklad: Fast food restaurace
Části hamburger nápoje dezert hračka Jiné části - stejná konstrukce Literatura:

6 Implementace Builderu
interface typicky abstraktní třída virtuální metody definují, co má každý ConcreteBuilder umět ne nutně „void“ např. vracení vytvořených častí Productu Product žádná abstraktní třída Nemá smysl – vytvořené objekty se hodně odlišují V ConcreteBuilder-i: nově zkonstruované části zpravidla stačí obyčejně připojit, příklad s čtením RTF – další zkonvertované tokeny se přidávají na konec.

7 Souvislosti a důsledky
Struktura konečného produktu vázaná na ConcreteBuilder interface pro konstrukci je stejný konkrétní implementační detaily skryté změna produktu = nový builder Oddělení konstrukce od reprezentace modularita, zapouzdření Umožňuje kontrolu konstrukce během jejího průběhu konstrukce produktu „step-by-step“ řeší kauzalitu při konstrukci jednotlivých bloků

8 Shrnutí Kdy použit Builder? Proč ho použit?
objekt se skládá z více částí složitý proces tvorby částí očekává se rozšíření budování immutable s mnoho volitelnými parametry Proč ho použit? izolace konstrukce a reprezentace umožňuje změnit strukturu bez přepisování všech ConcreteBuilderů třídy mohou zůstat neměnné (immutable)

9 Kde použít Konstruktory s volitelnými vlastnostmi Řešení
public class User { private final String firstName; //required private final String lastName; //required private final int age; //optional private final String phone; //optional private final String address; //optional } Konstruktory s volitelnými vlastnostmi chceme konstruktory s povinnými + všechny možné podmnožiny volitelných argumentů Nechceme veřejné „settery“ Ztratíme výhody neměnných (immutable) objektů Řešení Naprogramovat všechny možné konstruktory Použit volitelné argumenty Builder Pro .NET od verze 3.0 a C++ platí, že je možné použít koncept volitelných argumentů. Nicméně větší množství takových argumentů značně snižuje čitelnost kódu.

10 Kostruktory public User(String firstName, String lastName) {
this(firstName, lastName, 0); } public User(String firstName, String lastName, int age) { this(firstName, lastName, age, ""); public User(String firstName, String lastName, int age, String phone) { this(firstName, lastName, age, phone, ""); public User(String firstName, String lastName, int age, String phone, String address) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.phone = phone; this.address = address; // ... ještě další 4 konstruktory // rozšíření třídy User o 1 atribut problematické

11 Builder jediný argument konstruktoru třídy „User“: ConcreteBuilder
třída „User“ získá Product od ConcreteBuilder public class User { private readonly String firstName; // required private readonly String lastName; // required private readonly int age; // optional private readonly String phone; // optional private readonly String address; // optional // 1 private konstruktor s jediným argumentem: ConcreteBuilder private User(UserBuilder builder) { this.firstName = builder.firstName; this.lastName = builder.lastName; this.age = builder.age; this.phone = builder.phone; this.address = builder.address; // náchylnosti na chyby se zbavíme použitím automapperu }

12 Builder public class UserBuilder { private readonly String firstName;
private readonly String lastName; private int age; private String phone; private String address; public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(int age) { this.age = age; return this; public UserBuilder phone(String phone) { this.phone = phone; return this; public UserBuilder address(String address) { this.address = address; return this; public User build() { return new User(this);

13 Fluent builder var b builder = new User.UserBuilder("John", "Doe"):
builder = builder.age(30); builder = builder.phone(" "); builder = builder.address("Fake address 1234"); User user = builder.build();

14 Builder public class UserBuilder { private readonly String firstName;
private readonly String lastName; private int age; private String phone; private String address; //novy atribut private String ; public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(int age) { this.age = age; return this; public UserBuilder phone(String phone) { this.phone = phone; return this; public UserBuilder address(String address) { this.address = address; return this; //pridani atributu public UserBuilder (String ) { this. = ; return this; public User build() { return new User(this); Builder

15 Fluent builder var b builder = new User.UserBuilder("John", "Doe"):
builder = builder.age(30); builder = builder.phone(" "); builder = builder.address("Fake address 1234"); Builder = builder. User user = builder.build();

16 Související NV Abstract Factory
lze chápat jako limitní případ Builderu Builder vytvoří objekty postupně, po částích, vrátí až na požádání Produkty Builderu nemusí implementovat společný interface nasazení Abstract Factory preferujeme v případě, že celý objekt lze vytvořit „jediným voláním“, odpověď je získána hned Composite je často výsledkem práce Builderu

17 Příklad z reality @(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.CustomerViewModel>() .Name("grid") .Columns(columns => { columns.Bound(c => class='customer-photo' style='background-image: url(../content/web/Customers/#:data.CustomerID#.jpg);'></div> <div class='customer-name'>#: ContactName #</div>") .Width(240); columns.Bound(c => c.ContactTitle); columns.Bound(c => c.CompanyName); columns.Bound(c => c.Country).Width(150); }) .HtmlAttributes(new { style = "height: 550px;" }) .Scrollable() .Groupable() .Sortable() .Pageable(pageable => pageable .Refresh(true) .PageSizes(true) .ButtonCount(5)) .DataSource(dataSource => dataSource .Ajax() .Read(read => read.Action("Customers_Read", "Grid")) .PageSize(20) )

18 Příklad z reality

19 Nepřihlášený uživatel
Příklad z reality - SIS GUI stejný obsah položek jiné barvy, tvar Obsah podle přihlášeného uživatele jádro stejné další položky zobrazené/vynechané podle privilegií Nepřihlášený uživatel Přihlášený uživatel


Stáhnout ppt "Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“"

Podobné prezentace


Reklamy Google