160 likes | 368 Views
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
E N D
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 • ConcreteBuilder– napĺňa kontrakt Builderaa 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
Príklad Vytvárajúci kód je oddelený od reprezentácie vytváraného objektu, ktorý je vytváraný pomocou jednotného rozhrania.
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 potrebujeDirectorIdentifikovaťpredchádzajúce časti. • Niekedy sa nedefinuje abstraktná trieda pre Produkt (ten kto vyberá ConcreteBuilder vie aký ConcreteProductdostane). • Použitie tzv. Fluentinterface.
Vzťah k iným návrhovým vzorom • Factory metóda nám umožní vytvoriť objekt v jedným volaním, AbstractFactorynám umožní vytvárať konzistentné sady objektov, Buildernaopak umožňuje postupné vytváranie a skladanie objektu • Jeho produktom je často Composite
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
Builder ktorý používam ja • packageupjs.petruna.sai.builder; • publicclassFTPRequest { • privateintport; • privateStringhost; • privatebyte[] payload; • privateTimestamptimestamp; • privateFTPRequest(Builderbuilder) { • this.port = builder.port; • this.host = builder.host; • this.payload = builder.payload; • this.timestamp = builder.timestamp; • } • @Override • publicStringtoString() { • return"FTPRequest [port=" + port + ", host=" + host + ", payload=" • + Arrays.toString(payload) + ", timestamp=" + timestamp + "]"; • } • publicstaticclassBuilder{…} • }
Builder ktorý používam ja • publicstaticclassBuilder { • privateintport; • privateStringhost; • privatebyte[] payload; • privateTimestamptimestamp; • publicBuilder port(int port){ this.port=port; returnthis; } • publicBuilder host(String host){ this.host=host; returnthis; } • publicBuilderpayload(byte[] payload){ this.payload=payload; returnthis; } • publicBuildertimestamp(Timestamptimestamp){ this.timestamp=timestamp; returnthis; } • publicFTPRequestbuild(){ • returnnewFTPRequest(this); • } • }
Builder ktorý používam ja • packageupjs.petruna.sai.builder; • importjava.sql.Timestamp; • publicclassDirector { • publicstaticvoid main(String[] args) { • FTPRequestrequest = newFTPRequest.Builder().port(200) • .payload("payload".getBytes()).host("localhost") • .timestamp(newTimestamp(System.currentTimeMillis())).build(); • System.out.println(request); • } • } FTPRequest [port=200, host=localhost, payload=[112, 97, 121, 108, 111, 97, 100], timestamp=2012-10-01 22:05:36.671]
Príklady z Javy (1) • StringBuilder
Príklady z Javy (2) • SaxParser
Príklady z Javy (3) • MapMaker (Guava)