{"id":803,"date":"2022-12-11T19:49:51","date_gmt":"2022-12-11T18:49:51","guid":{"rendered":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/?p=803"},"modified":"2022-12-12T18:21:26","modified_gmt":"2022-12-12T17:21:26","slug":"wzorzec-fabryka","status":"publish","type":"post","link":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2022\/12\/11\/wzorzec-fabryka\/","title":{"rendered":"Wzorzec Fabryka"},"content":{"rendered":"\n<p><strong>Wzorzec Fabryka<\/strong> to popularna technika, kt\u00f3ra pozwala na stworzenie kodu uzale\u017cnionego od abstrakcji. Polega na oddelegowaniu tworzenia obiektu do innych klas. Wzorzec zapewnia hermetyzacj\u0119 procesu tworzenia obiekt\u00f3w, pozwala na oddzielnie kodu klienta od implementacji oraz realizuje regu\u0142\u0119 odwracania zale\u017cno\u015bci (DIP \u2013 Dependency Inversion Principle). Wzorzec wyst\u0119puje w dw\u00f3ch wariantach: <strong>Metoda Fabrykuj\u0105ca<\/strong> (Factory Method) i <strong>Fabryka Abstrakcyjna<\/strong> (Abstract Method).<\/p>\n\n\n\n<p><strong>Wzorzec<\/strong> <strong>Metoda Fabrykuj\u0105ca<\/strong> \u2013 opiera si\u0119 na wykorzystaniu mechanizmu dziedziczenia. Polega na zdefiniowaniu interfejsu pozwalaj\u0105cego na tworzenie obiekt\u00f3w oraz na przeniesienie odpowiedzialno\u015bci za tworzenie obiekt\u00f3w do klas podrz\u0119dnych, kt\u00f3re implementuj\u0105 metod\u0119 fabrykuj\u0105c\u0105. Wszystkie inne metody zaimplementowane w abstrakcyjnej klasie Fabryki operuj\u0105 na obiektach stworzonych przed metod\u0119 fabrykuj\u0105c\u0105. Klasa Fabryka posiada implementacje wszystkich potrzebnych metod poza metod\u0105 wytwarzaj\u0105c\u0105 produkty (metod\u0105 fabrykuj\u0105c\u0105). Metod\u0119 Fabrykuj\u0105c\u0105 musz\u0105 implementowa\u0107 wszystkie klasy podrz\u0119dne fabryki (fabryki rzeczywiste).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"529\" height=\"271\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml.png\" alt=\"\" class=\"wp-image-810\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml.png 529w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml-300x154.png 300w\" sizes=\"auto, (max-width: 529px) 100vw, 529px\" \/><figcaption class=\"wp-element-caption\">Rys 1. Diagram UML &#8211; wzorzec metoda fabrykuj\u0105ca.<\/figcaption><\/figure>\n\n\n\n<p>\u017beby lepiej zobrazowa\u0107 sobie funkcjonowanie tego wzorca przeanalizujmy przyk\u0142ad. Za\u0142\u00f3\u017cmy, \u017ce mamy dwie rodzaje piekarni. Pierwsza niech zajmuje si\u0119 wytwarzaniem pieczywa tradycyjnego, druga pieczywa w\u0142oskiego. Tak wygl\u0105da\u0142by kod bez u\u017cycia wzorca:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class PiekarniaBezWzorca {\n\n    public Pieczywo utworzPieczywo(String styl, String typ){\n        Pieczywo pieczywo = null;\n        if (styl.equals(\"Tradycyjne\")){\n            if (typ.equals(\"Chleb pszenny\")){\n                pieczywo = new TradycyjnyChlebPszenny();\n            } else if (typ.equals(\"Chleb \u017cytni\")){\n                pieczywo = new TradycyjnyChlebZytni();\n            }\n        } else if (styl.equals(\"W\u0142oskie\")){\n            if (typ.equals(\"Ciabatta\")){\n                pieczywo = new W\u0142oskieCiabatta();\n            } else if (typ.equals(\"Focaccia\")){\n                pieczywo = new W\u0142oskieFocaccia();\n            }\n        }\n        pieczywo.przygotowanie();\n        pieczywo.pieczenie();\n        pieczywo.pakowanie();\n        return pieczywo;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>W podanej wersji wszystkie obiekty Pieczywo s\u0105 tworzone wewn\u0105trz klasy. Klasa PiekarniaBezWzorca jest uzale\u017cniona od wszystkich obiekt\u00f3w, kt\u00f3re s\u0105 przez ni\u0105 bezpo\u015brednio tworzone.<\/p>\n\n\n\n<p>Tak b\u0119dzie wygl\u0105da\u0107 kod po zastosowaniu wzorca <strong>Metoda Fabrykuj\u0105ca<\/strong> i oddelegowaniu tworzenia obiektu Pieczywo to odpowiedniej podrz\u0119dnej klasy \u2013 PiekarniaW\u0142oska lub PiekarniaTradycyjna.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"716\" height=\"471\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml_piekarnia.png\" alt=\"\" class=\"wp-image-811\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml_piekarnia.png 716w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml_piekarnia-300x197.png 300w\" sizes=\"auto, (max-width: 716px) 100vw, 716px\" \/><figcaption class=\"wp-element-caption\">Rys 2. Diagram UML &#8211; zastosowanie wzorca Metoda Fabrykuj\u0105ca w praktyce.<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>public abstract class Piekarnia {\n\n    public Pieczywo zlecPieczywo(String typ){\n        Pieczywo pieczywo;\n        pieczywo = utworzPieczywo(typ);\n        pieczywo.przygotowanie();\n        pieczywo.pieczenie();\n        pieczywo.pakowanie();\n\n        return pieczywo;\n    }\n    abstract Pieczywo utworzPieczywo(String typ);\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class PiekarniaW\u0142oska extends Piekarnia{\n    @Override\n    Pieczywo utworzPieczywo(String typ) {\n        if (typ.equals(\"Ciabatta\")){\n            return new W\u0142oskieCiabatta();\n        } else if (typ.equals(\"Focaccia\")){\n            return new W\u0142oskieFocaccia();\n        } else return null;\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class PiekarniaTradycyjna extends Piekarnia{\n    @Override\n    Pieczywo utworzPieczywo(String typ) {\n        if (typ.equals(\"Chleb pszenny\")){\n            return new TradycyjnyChlebPszenny();\n        } else if (typ.equals(\"Chleb \u017cytni\")){\n            return new TradycyjnyChlebZytni();\n        } else return null;\n    }\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<p><strong>Wzorzec Fabryka Abstrakcyjna<\/strong> &#8211;&nbsp; polega na dostarczeniu interfejsu do tworzenia rodzin obiekt\u00f3w (kt\u00f3re s\u0105 ze sob\u0105 spokrewnione lub od siebie zale\u017cne). Klasa abstrakcyjna definiuje interfejs, kt\u00f3ry musi by\u0107 zaimplementowany przez wszystkie fabryki rzeczywiste. Fabryki rzeczywiste implementuj\u0105 r\u00f3\u017cne rodziny produkt\u00f3w.<\/p>\n\n\n\n<p>Powy\u017cszy wzorzec zosta\u0142 wykorzystany do stworzenia fabryki produkt\u00f3w do poszczeg\u00f3lnych piekarni.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"481\" src=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml_piekarniaAbs.png\" alt=\"\" class=\"wp-image-812\" srcset=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml_piekarniaAbs.png 724w, https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/wp-content\/uploads\/2022\/12\/fabryka_uml_piekarniaAbs-300x199.png 300w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><figcaption class=\"wp-element-caption\">Rys 3. Diagram UML &#8211; zastosowanie wzorca Fabryka Abstrakcyjna w praktyce.<\/figcaption><\/figure>\n\n\n\n<p>Poni\u017cej znajduj\u0119 si\u0119 kod dla fabryki sk\u0142adnik\u00f3w pieczywa w\u0142oskiego:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface FabrykaSkladnikowPieczywa {\n    public M\u0105ka utworzMaka();\n    public Zakwas utworzZakwas();\n}\npublic class FabrykaSkladnikowPieczywaWloskie implements FabrykaSkladnikowPieczywa {\n    @Override\n    public M\u0105ka utworzMaka() {\n        return new M\u0105kaW\u0142oska();\n    }\n    @Override\n    public Zakwas utworzZakwas() {\n        return new ZakwasWloski();\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Fabryk\u0119 sk\u0142adnik\u00f3w mo\u017cemy po\u0142\u0105czy\u0107 razem z piekarni\u0105, aby piekarnia u\u017cywa\u0142a odpowiednich sk\u0142adnik\u00f3w dla danego typu piekarni. Sp\u00f3jrzmy na kod zaimplementowany do piekarni w\u0142oskiej. Po dodaniu kilku aktualizacji: metody abstrakcyjnej w klasie Pieczywo oraz dodaniu odpowiedniej fabryki sk\u0142adnik\u00f3w otrzymujemy nast\u0119puj\u0105cy kod:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class PiekarniaW\u0142oska extends Piekarnia {\n    @Override\n    Pieczywo utworzPieczywo(String typ) {\n        Pieczywo pieczywo = null;\n        FabrykaSkladnikowPieczywa fabrykaSkladnikow = new FabrykaSkladnikowPieczywaWloskie();\n\n        if (typ.equals(\"Ciabatta\")){\n            pieczywo = new W\u0142oskieCiabatta(fabrykaSkladnikow);\n            pieczywo.ustawNazwePieczywa(\"Ciabatta\");\n        } else if (typ.equals(\"Focaccia\")){\n            pieczywo = new W\u0142oskieFocaccia(fabrykaSkladnikow);\n            pieczywo.ustawNazwePieczywa(\"Focaccia\");\n        }\n        return pieczywo;\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class W\u0142oskieFocaccia extends Pieczywo {\n\n    FabrykaSkladnikowPieczywa fabrykaSkladnikow;\n    public W\u0142oskieFocaccia(FabrykaSkladnikowPieczywa fabrykaSkladnikow){\n        this.fabrykaSkladnikow = fabrykaSkladnikow;\n    }\n\n    @Override\n    public void przygotowanie() {\n        System.out.println(\"W przygotowaniu: \" + nazwaPieczywa);\n        m\u0105ka = fabrykaSkladnikow.utworzMaka();\n        zakwas = fabrykaSkladnikow.utworzZakwas();\n        System.out.println(\"U\u017cyto m\u0105ki: \" + m\u0105ka.pobierzNazwe());\n        System.out.println(\"U\u017cyto zakwasu: \" + zakwas.pobierzNazwe());\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class W\u0142oskieCiabatta extends Pieczywo {\n\n    FabrykaSkladnikowPieczywa fabrykaSkladnikow;\n    public W\u0142oskieCiabatta(FabrykaSkladnikowPieczywa fabrykaSkladnikow){\n        this.fabrykaSkladnikow = fabrykaSkladnikow;\n    }\n\n    @Override\n    public void przygotowanie() {\n        System.out.println(\"W przygotowaniu: \" + nazwaPieczywa);\n        m\u0105ka = fabrykaSkladnikow.utworzMaka();\n        zakwas = fabrykaSkladnikow.utworzZakwas();\n        System.out.println(\"U\u017cyto m\u0105ki: \" + m\u0105ka.pobierzNazwe());\n        System.out.println(\"U\u017cyto zakwasu: \" + zakwas.pobierzNazwe());\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Main {\n    public static void main(String&#91;] args) {\n        Piekarnia piekarnia = new PiekarniaW\u0142oska();\n        piekarnia.zlecPieczywo(\"Ciabatta\");\n        System.out.println(\"-------------------\");\n        piekarnia.zlecPieczywo(\"Focaccia\");\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>Rezultatem testu jest:<\/p>\n\n\n\n<p>W przygotowaniu: Ciabatta<\/p>\n\n\n\n<p>U\u017cyto m\u0105ki: m\u0105ka w\u0142oska<\/p>\n\n\n\n<p>U\u017cyto zakwasu: zakwas w\u0142oski<\/p>\n\n\n\n<p>Pieczenie<\/p>\n\n\n\n<p>Pakowanie<\/p>\n\n\n\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n\n\n\n<p>W przygotowaniu: Focaccia<\/p>\n\n\n\n<p>U\u017cyto m\u0105ki: m\u0105ka w\u0142oska<\/p>\n\n\n\n<p>U\u017cyto zakwasu: zakwas w\u0142oski<\/p>\n\n\n\n<p>Pieczenie<\/p>\n\n\n\n<p>Pakowanie<\/p>\n\n\n<div class=\"has-text-align-right wp-block-post-date\"><time datetime=\"2022-12-11T19:49:51+01:00\">2022-12-11<\/time><\/div>","protected":false},"excerpt":{"rendered":"<p>Wzorzec Fabryka to popularna technika, kt\u00f3ra pozwala na stworzenie kodu uzale\u017cnionego od abstrakcji. Polega na oddelegowaniu tworzenia obiektu do innych klas. Wzorzec zapewnia hermetyzacj\u0119 procesu tworzenia obiekt\u00f3w, pozwala na oddzielnie kodu klienta od implementacji oraz realizuje regu\u0142\u0119 odwracania zale\u017cno\u015bci (DIP \u2013 Dependency Inversion Principle). Wzorzec wyst\u0119puje w dw\u00f3ch wariantach: Metoda Fabrykuj\u0105ca (Factory Method) i Fabryka &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/2022\/12\/11\/wzorzec-fabryka\/\"> <span class=\"screen-reader-text\">Wzorzec Fabryka<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":817,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[13],"tags":[],"class_list":["post-803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wzorce-projektowe"],"_links":{"self":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/comments?post=803"}],"version-history":[{"count":7,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/803\/revisions"}],"predecessor-version":[{"id":841,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/posts\/803\/revisions\/841"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media\/817"}],"wp:attachment":[{"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/media?parent=803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/categories?post=803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anna-mastalerczuk.profesjonalnyprogramista.pl\/index.php\/wp-json\/wp\/v2\/tags?post=803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}