{"id":74,"date":"2023-09-19T23:16:19","date_gmt":"2023-09-19T21:16:19","guid":{"rendered":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/?p=74"},"modified":"2023-09-19T23:16:19","modified_gmt":"2023-09-19T21:16:19","slug":"wzorce-projektowe-fabryka-factory","status":"publish","type":"post","link":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/?p=74","title":{"rendered":"Wzorce projektowe &#8211; Fabryka (factory)"},"content":{"rendered":"\n<p>Fabryka jest wzorcem kreacyjnym, kt\u00f3rego celem jest u\u0142atwienie tworzenia obiekt\u00f3w tego samego typu bez specyfikowania ich klas. Przyk\u0142adowo jest przydatne w grach strategicznych, gdzie jeden budynek (fabryka) produkuje kilka typ\u00f3w jednostek z r\u00f3\u017cnymi zmiennymi.<\/p>\n\n\n\n<p>Og\u00f3lna struktura tego wzorca wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"933\" height=\"570\" src=\"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/wp-content\/uploads\/2023\/09\/fabryka.jpg\" alt=\"\" class=\"wp-image-92\" srcset=\"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/wp-content\/uploads\/2023\/09\/fabryka.jpg 933w, https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/wp-content\/uploads\/2023\/09\/fabryka-300x183.jpg 300w, https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/wp-content\/uploads\/2023\/09\/fabryka-768x469.jpg 768w\" sizes=\"auto, (max-width: 933px) 100vw, 933px\" \/><\/figure>\n\n\n\n<p>W praktyce za\u0142\u00f3\u017cmy, \u017ce mamy aplikacj\u0119 &#8222;symuluj\u0105c\u0105&#8221; dwie restauracje: jedna serwuj\u0105ca burgera XXL i nap\u00f3j L, a druga burgera L i nap\u00f3j XXL w r\u00f3\u017cnych cenach. Bez zastosowania tego wzorca mog\u0142aby ona wygl\u0105da\u0107 tak:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class Main {\n    public static void main(String&#91;] args) {\n\n        Dish burger1 = new Burger(20, &quot;XXL&quot;);\n        Dish soda1 = new Soda(5, &quot;L&quot;);\n\n        Dish burger2 = new Burger(15, &quot;L&quot;);\n        Dish soda2 = new Soda(10, &quot;XXL&quot;);\n    }\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic abstract class Dish {\n    private int price;\n    private String size;\n\n    public Dish(int price, String size) {\n        this.price = price;\n        this.size = size;\n    }\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class Burger extends Dish{\n    public Burger(int price, String size) {\n        super(price, size);\n    }\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class Soda extends Dish{\n    public Soda(int price, String size) {\n        super(price, size);\n    }\n}\n\n<\/pre><\/div>\n\n\n<p>W takim przypadku trzeba zawsze pami\u0119ta\u0107, kt\u00f3ra restauracja jakie serwuje obiekty. Po zastosowaniu wzorca fabryka program m\u00f3g\u0142by prezentowa\u0107 si\u0119 w taki spos\u00f3b:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nimport dishes.*;\n\npublic class Main {\n    public static void main(String&#91;] args) {\n\n        Restaurant leftRestaurant = new LeftRestaurant();\n        Restaurant rightRestaurant = new RightRestaurant();\n\n        Dish leftBurger = leftRestaurant.createBurger();\n        Dish leftSoda = leftRestaurant.createSoda();\n\n        Dish rightBurger = rightRestaurant.createBurger();\n        Dish rightSoda = rightRestaurant.createSoda();\n    }\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage dishes;\n\npublic abstract class Dish {\n    private int price;\n    private String size;\n\n    public Dish(int price, String size) {\n        this.price = price;\n        this.size = size;\n    }\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage dishes;\n\npublic class Burger extends Dish{\n    public Burger(int price, String size) {\n        super(price, size);\n    }\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage dishes;\n\npublic class Soda extends Dish{\n    public Soda(int price, String size) {\n        super(price, size);\n    }\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage dishes;\n\npublic abstract class Restaurant {\n    public abstract Dish createBurger();\n    public abstract Dish createSoda();\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage dishes;\n\npublic class LeftRestaurant extends Restaurant{\n    @Override\n    public Dish createBurger() {\n        return new Burger(20, &quot;XXL&quot;);\n    }\n\n    @Override\n    public Dish createSoda() {\n        return new Soda(5, &quot;L&quot;);\n    }\n}\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage dishes;\n\npublic class RightRestaurant extends Restaurant{\n    @Override\n    public Dish createBurger() {\n        return new Burger(15, &quot;L&quot;);\n    }\n\n    @Override\n    public Dish createSoda() {\n        return new Soda(10, &quot;XXL&quot;);\n    }\n}\n\n<\/pre><\/div>\n\n\n<p>W tym konkretnym przypadku wzorzec fabryka dorobi\u0142 troch\u0119 kodu, ale jednocze\u015bnie go upro\u015bci\u0142. W bardziej rozbudowanych aplikacjach zmiana ta jest diametralna. <\/p>\n\n\n\n<p>Niestety najwi\u0119ksz\u0105 wad\u0105 tego wzorca jest to, \u017ce za ka\u017cdym razem jak chcemy doda\u0107 now\u0105 fabryk\u0119 lub produkty to musimy ingerowa\u0107 w wi\u0119kszo\u015b\u0107 poprzednich klas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fabryka jest wzorcem kreacyjnym, kt\u00f3rego celem jest u\u0142atwienie tworzenia obiekt\u00f3w tego samego typu bez specyfikowania ich klas. Przyk\u0142adowo jest przydatne w grach strategicznych, gdzie jeden budynek (fabryka) produkuje kilka typ\u00f3w jednostek z r\u00f3\u017cnymi zmiennymi. Og\u00f3lna struktura tego wzorca wygl\u0105da nast\u0119puj\u0105co: W praktyce za\u0142\u00f3\u017cmy, \u017ce mamy aplikacj\u0119 &#8222;symuluj\u0105c\u0105&#8221; dwie restauracje: jedna serwuj\u0105ca burgera XXL i nap\u00f3j [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-74","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/74","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=74"}],"version-history":[{"count":2,"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/74\/revisions"}],"predecessor-version":[{"id":93,"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/74\/revisions\/93"}],"wp:attachment":[{"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jan-napiorkowski.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}