15
Builder (design pattern) Bc. Martin Petruň 2.10.2012 SAI

Builder (design pattern)

Embed Size (px)

DESCRIPTION

Builder (design pattern). Bc. Martin Petru ňa 2.10.2012 SAI. Zaradenie. Builder patrí medzi vytváracie návrhové vzory Schéma:. Účastníci. Builder – definuje rozhranie pre konštrukciu častí vytváraného objektu - PowerPoint PPT Presentation

Citation preview

Page 1: Builder (design pattern)

Builder (design pattern)

Bc. Martin Petruňa2.10.2012

SAI

Page 2: Builder (design pattern)

Zaradenie

• Builder patrí medzi vytváracie návrhové vzory

• Schéma:

Page 3: Builder (design pattern)

Účastníci• Builder – definuje rozhranie pre konštrukciu častí

vytváraného objektu• ConcreteBuilder – napĺňa kontrakt Buildera a zároveň

zapúzdruje internú reprezentáciu stavaného objektu

• Director – postupne pomocou Buildera stavia objekt Product

• Product – definuje rozhranie budovaného objektu• ConcreteProduct – reprezentuje budovaný objekt

spĺňajúci kontrakt Product

Page 4: Builder (design pattern)

Príklad

Page 5: Builder (design pattern)

PríkladVytvárajúci kód je oddelený od reprezentácie vytváraného objektu, ktorý je vytváraný pomocou jednotného rozhrania.

Page 6: Builder (design pattern)

Implementačné detaily

• Abstraktná trieda Builder definuje prázdne metódy, ConcreteBuilder implementuje tie, ktoré podporuje.

• Novo pridané časti obyčajne stačí „pripojiť“ do internej štruktúry, inokedy ale potrebuje Director Identifikovať predchádzajúce časti.

• Niekedy sa nedefinuje abstraktná trieda pre Produkt (ten kto vyberá ConcreteBuilder vie aký ConcreteProduct dostane).

• Použitie tzv. Fluent interface.

Page 7: Builder (design pattern)

Vzťah k iným návrhovým vzorom

• Factory metóda nám umožní vytvoriť objekt v jedným volaním, AbstractFactory nám umožní vytvárať konzistentné sady objektov, Builder naopak umožňuje postupné vytváranie a skladanie objektu

• Jeho produktom je často Composite

Page 8: Builder (design pattern)

Builder a doporučené postupy OOP

• Zapúzdrenie – žiadne zbytočné setre

• Platný stav objektu – je možné interne kontrolovať stav budovaného objektu a odhaliť prípadné nezrovnalosti

• Absencia úzkych väzieb – v tomto prípade oddelenie konštrukcie (príp. validácie) od reprezentácie

• Čitateľnejší a prehľadnejší kód

• Lepšia testovateľnosť kódu

Page 9: Builder (design pattern)

Builder ktorý používam ja• package upjs.petruna.sai.builder;

• public class FTPRequest {

• private int port;• private String host;• private byte[] payload;• private Timestamp timestamp;

• private FTPRequest(Builder builder) {• this.port = builder.port;• this.host = builder.host;• this.payload = builder.payload;• this.timestamp = builder.timestamp;• }

• @Override• public String toString() {• return "FTPRequest [port=" + port + ", host=" + host + ", payload="• + Arrays.toString(payload) + ", timestamp=" + timestamp + "]";• }

• public static class Builder {…}• }

Page 10: Builder (design pattern)

Builder ktorý používam ja• public static class Builder {

• private int port;• private String host;• private byte[] payload;• private Timestamp timestamp;

• public Builder port(int port){ this.port=port; return this; }

• public Builder host(String host){ this.host=host; return this; }

• public Builder payload(byte[] payload){ this.payload=payload; return this; }

• public Builder timestamp(Timestamp timestamp){ this.timestamp=timestamp; return this; }

• public FTPRequest build(){• return new FTPRequest(this);• }

• }

Page 11: Builder (design pattern)

• package upjs.petruna.sai.builder;

• import java.sql.Timestamp;

• public class Director {

• public static void main(String[] args) {

• FTPRequest request = new FTPRequest.Builder().port(200)• .payload("payload".getBytes()).host("localhost")• .timestamp(new Timestamp(System.currentTimeMillis())).build();

• System.out.println(request);• }• }

Builder ktorý používam ja

FTPRequest [port=200, host=localhost, payload=[112, 97, 121, 108, 111, 97, 100], timestamp=2012-10-01 22:05:36.671]

Page 12: Builder (design pattern)

Príklady z Javy (1)

• StringBuilder

Page 13: Builder (design pattern)

Príklady z Javy (2)

• SaxParser

Page 14: Builder (design pattern)

Príklady z Javy (3)

• MapMaker (Guava)

Page 15: Builder (design pattern)

Ďakujem za pozornosť!