{"id":335,"date":"2017-05-11T15:00:55","date_gmt":"2017-05-11T13:00:55","guid":{"rendered":"http:\/\/antek.atthost24.pl\/?p=335"},"modified":"2017-05-12T10:14:21","modified_gmt":"2017-05-12T08:14:21","slug":"budowniczy-w-akcji","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/","title":{"rendered":"Budowniczy w akcji!"},"content":{"rendered":"<p>Dzisiaj porozmawiamy troch\u0119 o jednym z bardziej popularnych wzorc\u00f3w projektowych, a mianowicie o Budowniczym (Builder). Jest to jeden z kreacyjnych wzorc\u00f3w projektowych.<\/p>\n<h3>A na co to komu?<\/h3>\n<p>Dzi\u0119ki u\u017cyciu budowniczego mo\u017cemy z pewno\u015bci\u0105 osi\u0105gn\u0105\u0107 przynajmniej dwie rzeczy:<\/p>\n<ul>\n<li>oddzielimy tworzenie obiektu od jego\u00a0reprezentacji,<\/li>\n<li>nasz kod powinien sta\u0107 si\u0119 troch\u0119 bardziej przyjazny dla oka \ud83d\ude09<\/li>\n<\/ul>\n<h3>The good old way&#8230;<\/h3>\n<p>Na pocz\u0105tku zobaczmy jak b\u0119dzie wygl\u0105da\u0142 zwyk\u0142y obiekt POJO. Jako przyk\u0142ad stw\u00f3rzmy klas\u0119, kt\u00f3ra b\u0119dzie zawiera\u0142a wszystkie informacje o mailu, kt\u00f3ry b\u0119dzie m\u00f3g\u0142 by\u0107 p\u00f3\u017aniej wys\u0142any.<\/p>\n<pre class=\"lang:java decode:true \">public class Mail {\r\n\tprivate final String to;\r\n\tprivate final String cc;\r\n\tprivate final String subject;\r\n\tprivate final String content;\r\n\r\n\tpublic Mail(String to, String cc, String subject, String content) {\r\n\t\tthis.to = to;\r\n\t\tthis.cc = cc;\r\n\t\tthis.subject = subject;\r\n\t\tthis.content = content;\r\n\t}\r\n\r\n\tpublic String getTo() {\r\n\t\treturn to;\r\n\t}\r\n\r\n\tpublic String getCc() {\r\n\t\treturn cc;\r\n\t}\r\n\r\n\tpublic String getSubject() {\r\n\t\treturn subject;\r\n\t}\r\n\r\n\tpublic String getContent() {\r\n\t\treturn content;\r\n\t}\r\n}<\/pre>\n<p>Jak widzimy, nasza klasa ma za zadanie przechowanie informacji o tym do kogo mail b\u0119dzie wys\u0142any (<em>to<\/em>), dodatkowych odbior\u00f3w (<em>cc<\/em>), temat maila (<em>subject<\/em>) oraz jego tre\u015b\u0107 (<em>content<\/em>).<\/p>\n<p>Stw\u00f3rzmy teraz instancje naszej klasy:<\/p>\n<pre class=\"lang:default decode:true \">final Mail mail = new Mail(\"to@lantkowiak.pl\", \"cc@lantkowiak.pl\", \"My subject\", \"Some content\");<\/pre>\n<p>Co prawda ten kod nie wygl\u0105da jeszcze zbyt strasznie, ale wyobra\u017amy sobie teraz, \u017ce do naszej klasy dodajemy jeszcze kilka p\u00f3l jak bcc, mime type, za\u0142\u0105czniki i jeszcze kilka innych. Wtedy nasza klasa\u00a0troch\u0119 si\u0119 rozro\u015bnie i stworzenie instancji tej klasy nie b\u0119dzie wygl\u0105da\u0142o zbyt przyjemnie, szczeg\u00f3lnie maj\u0105c na uwadze, \u017ce du\u017co p\u00f3l naszej klasy ma ten sam typ.<\/p>\n<h3>A co je\u015bli&#8230;<\/h3>\n<p>Mo\u017cemy si\u0119 okaza\u0107, \u017ce cz\u0119\u015b\u0107 p\u00f3l w naszej klasie nie jest obowi\u0105zkowa przy tworzeniu naszego obiektu. W naszym przyk\u0142adzie pole <em>cc<\/em> nie musi by\u0107 obowi\u0105zkowe. Co w takim przypadku powinni\u015bmy zrobi\u0107?<\/p>\n<p>Mo\u017cemy stworzy\u0107\u00a0dodatkowy konstruktor bez pola <em>cc <\/em>\ud83d\ude42 Tylko co je\u015bli p\u00f3l opcjonalnych b\u0119dziemy mie\u0107 kilka? Tworzenie wszystkich kombinacji konstruktor\u00f3w zdecydowanie odpada.<\/p>\n<p>W takim przypadku mo\u017cemy przecie\u017c stworzy\u0107 POJO z setterami\/getterami \ud83d\ude42<\/p>\n<pre class=\"lang:default decode:true \">public class Mail {\r\n\tprivate String to;\r\n\tprivate String cc;\r\n\tprivate String subject;\r\n\tprivate String content;\r\n\r\n\tpublic String getTo() {\r\n\t\treturn to;\r\n\t}\r\n\r\n\tpublic String getCc() {\r\n\t\treturn cc;\r\n\t}\r\n\r\n\tpublic String getSubject() {\r\n\t\treturn subject;\r\n\t}\r\n\r\n\tpublic String getContent() {\r\n\t\treturn content;\r\n\t}\r\n\r\n\tpublic void setTo(String to) {\r\n\t\tthis.to = to;\r\n\t}\r\n\r\n\tpublic void setCc(String cc) {\r\n\t\tthis.cc = cc;\r\n\t}\r\n\r\n\tpublic void setSubject(String subject) {\r\n\t\tthis.subject = subject;\r\n\t}\r\n\r\n\tpublic void setContent(String content) {\r\n\t\tthis.content = content;\r\n\t}\r\n}<\/pre>\n<p>I stw\u00f3rzmy teraz instancje naszej klasy, tylko tym razem bez inicjowania\u00a0pola <em>cc<\/em>:<\/p>\n<pre class=\"lang:default decode:true \">final Mail mail = new Mail();\r\nmail.setTo(\"to@lantkowiak.pl\");\r\nmail.setSubject(\"My subject\");\r\nmail.setContent(\"Some content\");<\/pre>\n<p>Podej\u015bcie to pozwala nam stworzy\u0107 instancje naszego obiektu tylko z wybranymi przez nas polami. Dzi\u0119ki setterom jest r\u00f3wnie\u017c trudniej o pomy\u0142k\u0119 zwi\u0105zan\u0105 z kolejno\u015bci\u0105 przekazywanych parametr\u00f3w do konstruktora.<\/p>\n<h3>Czy mo\u017cna zrobi\u0107 to \u0142adniej?<\/h3>\n<p>Wydaj\u0119 mi si\u0119, \u017ce mo\u017cna \ud83d\ude09 I w\u0142a\u015bnie budowniczy przyjdzie nam z pomoc\u0105 \ud83d\ude42<\/p>\n<p>Budowniczy pomaga nam w tworzeniu skomplikowanych obiekt\u00f3w poprzez danie mo\u017cliwo\u015bci tworzenia (budowania) ich kawa\u0142ek po kawa\u0142ku. Stw\u00f3rzmy zatem budowniczego do naszej klasy \ud83d\ude42<\/p>\n<pre class=\"lang:default decode:true\">public class Mail {\r\n\tprivate String to;\r\n\tprivate String cc;\r\n\tprivate String subject;\r\n\tprivate String content;\r\n\r\n\tprivate Mail() {\r\n\t}\r\n\r\n\tpublic String getTo() {\r\n\t\treturn to;\r\n\t}\r\n\r\n\tpublic String getCc() {\r\n\t\treturn cc;\r\n\t}\r\n\r\n\tpublic String getSubject() {\r\n\t\treturn subject;\r\n\t}\r\n\r\n\tpublic String getContent() {\r\n\t\treturn content;\r\n\t}\r\n\r\n\tpublic static Builder builder() {\r\n\t\treturn new Builder();\r\n\t}\r\n\r\n\tpublic static class Builder {\r\n\t\tprivate Mail mail;\r\n\r\n\t\tpublic Builder() {\r\n\t\t\tthis.mail = new Mail();\r\n\t\t}\r\n\r\n\t\tpublic Builder to(final String to) {\r\n\t\t\tthis.mail.to = to;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tpublic Builder cc(final String cc) {\r\n\t\t\tthis.mail.cc = cc;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tpublic Builder subject(final String subject) {\r\n\t\t\tthis.mail.subject = subject;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tpublic Builder content(final String content) {\r\n\t\t\tthis.mail.content = content;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tpublic Mail build() {\r\n\t\t\treturn this.mail;\r\n\t\t}\r\n\t}<\/pre>\n<p>Zmiany, kt\u00f3rych dokonali\u015bmy w naszej klasie to:<\/p>\n<ul>\n<li>stworzyli\u015bmy prywatny konstruktor do klasy Mail, aby nikt nie stworzy\u0142 nam naszego obiektu na lewo ;),<\/li>\n<li>dodali\u015bmy statyczn\u0105 metod\u0119 <em>builder()<\/em>, kt\u00f3ra zwraca now\u0105 instancje budowniczego,<\/li>\n<li>dodali\u015bmy samego budowniczego.<\/li>\n<\/ul>\n<p>Klasa budowniczego zawiera w sobie pole z instancj\u0105 budowanego obiektu, metody odpowiadaj\u0105ce ustawianym polom oraz metod\u0119 <em>build()<\/em>, kt\u00f3ra wie\u0144czy dzie\u0142o i zwraca nam nasz\u0105 zbudowan\u0105 instancje klasy Mail. Zwr\u00f3\u0107my uwag\u0119, \u017ce metody budowniczego zwracaj\u0105 instancje budowniczego. Dzi\u0119ki czemu mo\u017cemy zbudowa\u0107 nasz obiekt w spos\u00f3b 'p\u0142ynny&#8217; (fluent interface) \ud83d\ude09<\/p>\n<pre class=\"lang:default decode:true \">final Mail mail = Mail.builder()\r\n\t\t.to(\"to@lantkowiak.pl\")\r\n\t\t.subject(\"My subject\")\r\n\t\t.content(\"Some content\")\r\n\t\t.build();<\/pre>\n<p>I w ten oto spos\u00f3b uda\u0142o nam si\u0119 stworzy\u0107 prostego budowniczego \ud83d\ude42<\/p>\n<h3>A co je\u015bli&#8230; (cz. 2)<\/h3>\n<p>Wcze\u015bniej zauwa\u017cyli\u015bmy, \u017ce cz\u0119\u015b\u0107 p\u00f3l z naszej klasy mo\u017ce by\u0107 opcjonalna. Warto, \u017ceby\u015bmy te\u017c popatrzyli w drug\u0105 stron\u0119 &#8211; cz\u0119\u015b\u0107 p\u00f3l z mo\u017ce by\u0107 konieczna do poprawnego\u00a0zainicjowania naszego obiektu. W naszej klasie Mail mo\u017cemy uzna\u0107, \u017ce pola <em>to<\/em>, <em>subject<\/em> i <em>content<\/em> s\u0105 obowi\u0105zkowe. I co teraz?<\/p>\n<h4>The good old way jeszcze raz \ud83d\ude09<\/h4>\n<p>Wr\u00f3\u0107my na sekund\u0119 do podej\u015bcia z POJO. Problem ten mo\u017cemy tutaj rozwi\u0105za\u0107 poprzez stworzenie konstruktora, kt\u00f3ry b\u0119dzie przyjmowa\u0107 obowi\u0105zkowe parametry oraz stworzeniem setter\u00f3w dla parametr\u00f3w opcjonalnych.<\/p>\n<pre class=\"lang:default decode:true \">public class Mail {\r\n\tprivate final String to;\r\n\tprivate String cc;\r\n\tprivate final String subject;\r\n\tprivate final String content;\r\n\r\n\tpublic Mail(String to, String subject, String content) {\r\n\t\tthis.to = to;\r\n\t\tthis.subject = subject;\r\n\t\tthis.content = content;\r\n\t}\r\n\r\n\tpublic String getTo() {\r\n\t\treturn to;\r\n\t}\r\n\r\n\tpublic String getCc() {\r\n\t\treturn cc;\r\n\t}\r\n\r\n\tpublic String getSubject() {\r\n\t\treturn subject;\r\n\t}\r\n\r\n\tpublic String getContent() {\r\n\t\treturn content;\r\n\t}\r\n\t\r\n\tpublic void setCc(String cc) {\r\n\t\tthis.cc = cc;\r\n\t}\r\n}<\/pre>\n<p>Tylko w tym podej\u015bciu zn\u00f3w powraca problem z wieloma parametrami w konstruktorze, kt\u00f3re nie wygl\u0105daj\u0105 zbyt \u0142adnie oraz dodatkowo nie jest trudno o pomy\u0142k\u0119.<\/p>\n<h4>I wr\u00f3\u0107my do budowniczego<\/h4>\n<p>A jak mo\u017cemy ten problem rozwi\u0105za\u0107 w budowniczym?<\/p>\n<p>Mo\u017cemy obowi\u0105zkowe parametry przekaza\u0107 do konstruktora budowniczego, ale oczywi\u015bcie rezygnujemy z tej opcji \ud83d\ude09<\/p>\n<p>Do rozwi\u0105zania tego problemu musimy troch\u0119 zmodyfikowa\u0107 naszego budowniczego, kt\u00f3rego ju\u017c stworzyli\u015bmy.<\/p>\n<p>Na pocz\u0105tku stw\u00f3rzmy sobie kilka prostych interfejs\u00f3w.<\/p>\n<pre class=\"lang:default decode:true\">public interface ToStep {\r\n\tpublic SubjectStep to(final String to);\r\n}\r\n\r\npublic interface SubjectStep {\r\n\tpublic ContentStep subject(final String subject);\r\n}\r\n\r\npublic interface ContentStep {\r\n\tpublic OptionalSteps content(final String content);\r\n}\r\n\r\npublic interface OptionalSteps {\r\n\tpublic OptionalSteps cc(final String cc);\r\n\r\n\tpublic Mail build();\r\n}<\/pre>\n<p>Zauwa\u017cmy, \u017ce dla ka\u017cdego obowi\u0105zkowego pola stworzyli\u015bmy interfejs, kt\u00f3ry zawiera dok\u0142adnie jedn\u0105 metod\u0119 odpowiadaj\u0105c\u0105 za ustawienie tego pola. Zwr\u00f3\u0107my uwag\u0119 te\u017c, \u017ce metoda ustawiaj\u0105ce dane pole zwraca interfejs do ustawienia kolejnego obowi\u0105zkowego pola. Wyj\u0105tkiem jest interfejs <em>ContentStep<\/em>, kt\u00f3ry ustawia ostatnie obowi\u0105zkowe pole i zwraca interfejs\u00a0<em>OptionalSteps<\/em>, kt\u00f3ry zawiera mo\u017cliwo\u015b\u0107 ustawienia wszystkich opcjonalnych p\u00f3l oraz metod\u0119 <em>build()<\/em>, kt\u00f3ra zwraca nam gotowy obiekt.<\/p>\n<p>Teraz musimy u\u017cy\u0107 tych interfejs\u00f3w w naszym budowniczym.<\/p>\n<pre class=\"lang:default decode:true \">private static class Builder implements ToStep, SubjectStep, ContentStep, OptionalSteps {\r\n\tprivate Mail mail;\r\n\r\n\tpublic Builder() {\r\n\t\tthis.mail = new Mail();\r\n\t}\r\n\r\n\tpublic SubjectStep to(final String to) {\r\n\t\tthis.mail.to = to;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic OptionalSteps cc(final String cc) {\r\n\t\tthis.mail.cc = cc;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic ContentStep subject(final String subject) {\r\n\t\tthis.mail.subject = subject;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic OptionalSteps content(final String content) {\r\n\t\tthis.mail.content = content;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic Mail build() {\r\n\t\treturn this.mail;\r\n\t}\r\n}<\/pre>\n<p>Sama implementacja znacz\u0105co si\u0119 nie zmieni\u0142a. Teraz nasz builder implementuje stworzone przez nas interfejsy. Musieli\u015bmy te\u017c zmieni\u0107 zwracane typy w metodach budowniczego.<\/p>\n<p>I ostatnia zmiana, kt\u00f3r\u0105 musieli\u015bmy zrobi\u0107 to zmiana typu zwracanego w metodzie tworz\u0105cej naszego budowniczego, \u017ceby zwraca\u0142a interfejs do pierwszego obowi\u0105zkowego pola.<\/p>\n<pre class=\"lang:default decode:true \">public static ToStep builder() {\r\n\treturn new Builder();\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Samo budowanie obiektu nie zmieni\u0142o si\u0119 w por\u00f3wnaniu do tego, jak by\u0142o w naszym pierwszym budowniczym, ale dzi\u0119ki tym kilku\u00a0interfejsom klient u\u017cywaj\u0105cy naszego budowniczego b\u0119dzie musia\u0142 poda\u0107 wszystkie obowi\u0105zkowe pola, \u017ceby utworzy\u0107 obiekt.<\/p>\n<p>I to jest w\u0142a\u015bnie to, co chcieli\u015bmy osi\u0105gn\u0105\u0107 \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj porozmawiamy troch\u0119 o jednym z bardziej popularnych wzorc\u00f3w projektowych, a mianowicie o Budowniczym (Builder). Jest to jeden z kreacyjnych wzorc\u00f3w projektowych. A na co to komu? Dzi\u0119ki&#8230;<\/p>\n","protected":false},"author":1,"featured_media":336,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,21],"tags":[8,22],"class_list":["post-335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dsp2017","category-wzorce-projektowe","tag-java","tag-wzorzec-projektowy"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Budowniczy w akcji! - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Budowniczy w akcji! - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj porozmawiamy troch\u0119 o jednym z bardziej popularnych wzorc\u00f3w projektowych, a mianowicie o Budowniczym (Builder). Jest to jeden z kreacyjnych wzorc\u00f3w projektowych. A na co to komu? Dzi\u0119ki...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-11T13:00:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-05-12T08:14:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/05\/bob.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"315\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/\",\"name\":\"Budowniczy w akcji! - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2017-05-11T13:00:55+00:00\",\"dateModified\":\"2017-05-12T08:14:21+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Budowniczy w akcji!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Budowniczy w akcji! - Lukasz Antkowiak&#039;s blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/","og_locale":"pl_PL","og_type":"article","og_title":"Budowniczy w akcji! - Lukasz Antkowiak&#039;s blog","og_description":"Dzisiaj porozmawiamy troch\u0119 o jednym z bardziej popularnych wzorc\u00f3w projektowych, a mianowicie o Budowniczym (Builder). Jest to jeden z kreacyjnych wzorc\u00f3w projektowych. A na co to komu? Dzi\u0119ki...","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2017-05-11T13:00:55+00:00","article_modified_time":"2017-05-12T08:14:21+00:00","og_image":[{"width":600,"height":315,"url":"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/05\/bob.jpeg","type":"image\/jpeg"}],"author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"7 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/","name":"Budowniczy w akcji! - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2017-05-11T13:00:55+00:00","dateModified":"2017-05-12T08:14:21+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/05\/11\/budowniczy-w-akcji\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Budowniczy w akcji!"}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=335"}],"version-history":[{"count":6,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/335\/revisions"}],"predecessor-version":[{"id":342,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/335\/revisions\/342"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media\/336"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}