﻿
{"id":3653,"date":"2016-03-07T20:01:10","date_gmt":"2016-03-07T20:01:10","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3653"},"modified":"2016-03-07T20:01:11","modified_gmt":"2016-03-07T20:01:11","slug":"c-factory-method-design-patternfactory-method-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-factory-method-design-patternfactory-method-tasarim-deseni\/","title":{"rendered":"C# Factory Method Design Pattern(Factory Method Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\nCreational Patterns (Olu\u015fturucu Kal\u0131plar) kategorisine giren Factory Method Design Pattern \u00fczerine detayl\u0131 bir inceleme ger\u00e7ekle\u015ftirece\u011fiz. Factory Metod tasar\u0131m deseni, birbirleriyle ili\u015fkili nesneleri olu\u015fturmam\u0131zda bize olduk\u00e7a alternatif bir metod sunmaktad\u0131r. As\u0131l ama\u00e7, olu\u015fturmak istedi\u011fimiz s\u0131n\u0131f\u0131n kendisinden bir \u00f6rnek istemek yerine Factory Metod patterni sayesinde tek bir instance \u00fczerinden gerekli nesnenin \u00fcretilmesini sa\u011flamakt\u0131r.<\/p>\n<p>Burada \u015f\u00f6yle d\u00fc\u015f\u00fcnebilirsiniz. Algoritman\u0131zda belirli ad\u0131mlarda farkl\u0131 tiplerde nesnelere ihtiyac\u0131n\u0131z olabilir. Bu nesneleri if &#8211; else veyahut switch yap\u0131lar\u0131 arac\u0131l\u0131\u011f\u0131yla, duruma g\u00f6re olu\u015fturabilirsiniz. Tabi bunu her seferinde yapman\u0131n zaman ve kod a\u00e7\u0131s\u0131ndan \u00e7ok tasarruflu oldu\u011funu d\u00fc\u015f\u00fcn\u00fclemez. \u0130\u015fte b\u00f6yle durumlarda Factory Method paternini kullanabilirsiniz.<\/p>\n<p>Bir ba\u015fka deyi\u015fle, elinizin alt\u0131ndaki birden \u00e7ok ili\u015fkisel s\u0131n\u0131ftan(veyahut Entityden) nesne \u00fcreteceksiniz, s\u00f6z gelimi her defas\u0131nda ilgili nesneye \u00f6zel \u00fcretme gramerini uygulaman\u0131za gerek kalmayaca, tek bir s\u0131n\u0131f \u00fczerinden olu\u015fturaca\u011f\u0131n\u0131z nesne talebiyle istedi\u011finiz nesneyi elde edebileceksiniz.<\/p>\n<p>Bu i\u015flemi ger\u00e7ekle\u015ftirmek i\u00e7in &#8220;abstract class&#8221; ya da &#8220;interface&#8221; yap\u0131lar\u0131ndan faydalanaca\u011f\u0131z. Bu yap\u0131lardan faydalanmam\u0131z\u0131n sebebi, bu yap\u0131lardan kal\u0131t\u0131m alan s\u0131n\u0131f\u0131n, abstract ya da interface i\u00e7erisindeki eleman\u0131 mecbur uygulamak zorunda kalmas\u0131d\u0131r. Ama daha m\u00fchimi, farkl\u0131 tipteki nesneleri olu\u015fturmakla ilgilenmek zorunda kalmayacak olan Base Class&#8217;\u0131m\u0131z\u0131n<em>(ki bu s\u0131n\u0131ftan olu\u015fturulmas\u0131n\u0131 istedi\u011fimiz nesneleri t\u00fcretece\u011fiz)<\/em> olu\u015fturdu\u011fu nesneyi Polymorphism(\u00e7ok bi\u00e7imlilik) arac\u0131l\u0131\u011f\u0131 ile \u00fcst bir referanst t\u00fcr\u00fc ile i\u015faretleyebilmektir.<\/p>\n<div id=\"attachment_3654\" style=\"width: 390px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-factory-method-design-patternfactory-method-tasarim-deseni\/c-factory-method-design-patternfactory-method-tasarim-deseni\/\" rel=\"attachment wp-att-3654\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3654\" class=\"size-full wp-image-3654\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/03\/C-Factory-Method-Design-PatternFactory-Method-Tasar\u0131m-Deseni.gif\" alt=\"C# Factory Method Design Pattern(Factory Method Tasar\u0131m Deseni)\" width=\"380\" height=\"323\" \/><\/a><p id=\"caption-attachment-3654\" class=\"wp-caption-text\">C# Factory Method Design Pattern(Factory Method Tasar\u0131m Deseni)<\/p><\/div>\n<p>Yukar\u0131daki \u015fablonu inceleyerek bir senaryo \u00e7izelim. Tabi senaryomuzu ben bu paragrafta teorik olarak kurgulayaca\u011f\u0131m. A\u015fa\u011f\u0131da benzer nitelikte farkl\u0131 bir senaryo \u00fczerinden Factory Method paternini uygulayaca\u011f\u0131z.<\/p>\n<p>Yukar\u0131daki \u015fablona g\u00f6re elimizdeki birden fazla \u00fcr\u00fcn interface taraf\u0131ndan t\u00fcretilmektedir. Tabi yaz\u0131m\u0131z\u0131n ba\u015f\u0131nda da belirtti\u011fim gibi bu \u00fcr\u00fcnleri abstract s\u0131n\u0131f ile de t\u00fcretebiliriz ki iki durumda da \u00f6rneklendirme ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p>\u0130\u00e7erisinde geriye ilgili interface ya da abstract class tipinde de\u011fer geri d\u00f6nen Factory i\u015flemini ger\u00e7ekle\u015ftirecek bir metod bar\u0131nd\u0131ran Creator s\u0131n\u0131f\u0131m\u0131z mevcuttur. \u0130stedi\u011fimiz \u00fcr\u00fcn\u00fc olu\u015fturabilmek i\u00e7in Creater tipinde bir nesne \u00fczerinden Factory metodunu kullanmam\u0131z yeterli olacakt\u0131r. Factory metodu bize istedi\u011fimiz \u00fcr\u00fcn\u00fcn nesnesini olu\u015fturacak ve interface ya da abstract class\u00a0tipinde geri d\u00f6nd\u00fcrecektir. Haliyle bizde interface ya da abstract class\u00a0referans\u0131 \u00fczerinden o nesneyi i\u015faretleyebilecek ve g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla kullanabilece\u011fiz.<\/p>\n<p>\u015eimdi s\u0131ra pratik olarak Factory Method Design Patter&#8217;in nas\u0131l yap\u0131ld\u0131\u011f\u0131 \u00fczerinde \u00e7al\u0131\u015fmaya geldi. Hemen kurgulayaca\u011f\u0131m senaryoyu sizlerle payla\u015fmam gerekirse, ben bir oyun sat\u0131c\u0131s\u0131y\u0131m ve &#8220;atari&#8221;, &#8220;pc&#8221; ve &#8220;ps&#8221; oyunlar\u0131 mevcut. Hadi gelin projemizi hemen dizayn edelim ve Factory Method paterni ile istedi\u011fimiz oyunu \u00fcretelim.<\/p>\n<h3>Abstract Class \u0130le Factory Method Design Pattern<\/h3>\n<p>\u00d6ncelikle abstract s\u0131n\u0131flarla Factory Design Pattern&#8217;i uygulamay\u0131 g\u00f6relim.<\/p>\n<p>Yukar\u0131da kurgulad\u0131\u011f\u0131m senaryoya g\u00f6re t\u00fcm \u00fcr\u00fcnlerimi yani oyunlar\u0131m\u0131 t\u00fcretece\u011fim abstract class&#8217;\u0131 dizayn edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    abstract class Oyun\r\n    {\r\n        public abstract void Platform();\r\n    }\r\n<\/pre>\n<p>\u015eimdide \u00fcr\u00fcnlerimizi tasarlayal\u0131m ve olu\u015fturmu\u015f oldu\u011fumuz &#8220;Oyun&#8221; abstract class&#8217;\u0131ndan bu \u00fcr\u00fcnleri t\u00fcretelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Atari : Oyun\r\n    {\r\n        public override void Platform()\r\n        {\r\n            Console.WriteLine(&quot;Bu oyun ATAR\u0130 platformunda \u00e7al\u0131\u015fmaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class PC : Oyun\r\n    {\r\n        public override void Platform()\r\n        {\r\n            Console.WriteLine(&quot;Bu oyun PC platformunda \u00e7al\u0131\u015fmaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class PS : Oyun\r\n    {\r\n        public override void Platform()\r\n        {\r\n            Console.WriteLine(&quot;Bu oyun PS platformunda \u00e7al\u0131\u015fmaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi oyun \u00fcr\u00fcnlerimin s\u0131n\u0131flar\u0131n\u0131 olu\u015fturdum.<\/p>\n<p>Art\u0131k bu s\u0131n\u0131flardan nesne \u00fcretecek olan Creater s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m ve i\u00e7erisine Factory i\u015flemini yapacak metodumuzu tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Creater\r\n    {\r\n        public Oyun FactoryMethod()\r\n        {\r\n          ...\r\n        }\r\n    }\r\n<\/pre>\n<p>\u015eimdi bu metodu tam olarak olu\u015fturmadan \u00f6nce bahsetmem gereken bir durum var. FactoryMethod&#8217;u bize istedi\u011fimiz tipte nesneyi olu\u015fturup g\u00f6nderek bir i\u015fleyi\u015fe sahip olacakt\u0131r dedik. &#8220;Eee anlad\u0131k hocam da FactoryMethod benim istedi\u011fim nesneyi nereden bilecek?&#8221; diye sorarsan\u0131z e\u011fer i\u015fte burada bunu Enumaration ile halledebiliriz. A\u015fa\u011f\u0131daki Enumaration FactoryMethod&#8217;un hangi tipte nesne \u00fcretece\u011fine yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    enum Oyunlar\r\n    {\r\n        Atari,\r\n        PC,\r\n        PS\r\n    }\r\n<\/pre>\n<p>Bu i\u015flemden sonra FactoryMethod&#8217;u tam olarak in\u015fa edebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Creater\r\n    {\r\n        public Oyun FactoryMethod(Oyunlar OyunTipi)\r\n        {\r\n            Oyun oyun = null;\r\n            switch (OyunTipi)\r\n            {\r\n                case Oyunlar.Atari:\r\n                    oyun = new Atari();\r\n                    break;\r\n                case Oyunlar.PC:\r\n                    oyun = new PC();\r\n                    break;\r\n                case Oyunlar.PS:\r\n                    oyun = new PS();\r\n                    break;\r\n            }\r\n            return oyun;\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi FactoryMethod parametresinde belirtti\u011fimiz tipe g\u00f6re istedi\u011fimiz nesneyi olu\u015fturacak bir i\u015fleyi\u015fe sahip oldu. Burada dikkat etmeniz gereken husus, her bir oyun \u00fcr\u00fcn\u00fcn\u00fcn &#8220;Oyun&#8221; abstract class&#8217;\u0131ndan kal\u0131t\u0131m almas\u0131ndan dolay\u0131 \u00e7ok bi\u00e7imlilik kullan\u0131larak &#8220;Oyun&#8221; referans\u0131nda tutulabilmekte ve geriye d\u00f6nd\u00fcr\u00fclebilmektedir.<\/p>\n<p>S\u0131ra geldi istedi\u011fimiz nesneyi \u00fcretmeye&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Creater creater = new Creater();\r\n            Oyun atariOyunu = creater.FactoryMethod(Oyunlar.Atari);\r\n            Oyun pcOyunu = creater.FactoryMethod(Oyunlar.PC);\r\n            Oyun psOyunu = creater.FactoryMethod(Oyunlar.PS);\r\n\r\n            atariOyunu.Platform();\r\n            pcOyunu.Platform();\r\n            psOyunu.Platform();\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u00c7\u0131kt\u0131 olarak a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcne g\u00f6z atabilirsiniz.<\/p>\n<div id=\"attachment_3655\" style=\"width: 346px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-factory-method-design-patternfactory-method-tasarim-deseni\/c-factory-method-design-patternfactory-method-tasarim-deseni-2\/\" rel=\"attachment wp-att-3655\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3655\" class=\"size-full wp-image-3655\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/03\/C-Factory-Method-Design-PatternFactory-Method-Tasar\u0131m-Deseni.png\" alt=\"C# Factory Method Design Pattern(Factory Method Tasar\u0131m Deseni)\" width=\"336\" height=\"97\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/03\/C-Factory-Method-Design-PatternFactory-Method-Tasar\u0131m-Deseni.png 336w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/03\/C-Factory-Method-Design-PatternFactory-Method-Tasar\u0131m-Deseni-300x87.png 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/a><p id=\"caption-attachment-3655\" class=\"wp-caption-text\">C# Factory Method Design Pattern(Factory Method Tasar\u0131m Deseni)<\/p><\/div>\n<p>Uzun laf\u0131n k\u0131sas\u0131, bu yapt\u0131\u011f\u0131m\u0131z i\u015flem tek bir Creater nesnesi \u00fczerinden istedi\u011fimiz s\u0131n\u0131f\u0131n nesnesini \u00fcrettirmek ve a\u015fa\u011f\u0131daki uzun ve ili\u015fkisiz nesne \u00fcretimlerini engellemektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Atari atari = new Atari();\r\n            PC pc = new PC();\r\n            PS ps = new PS();\r\n\r\n            atari.Platform();\r\n            pc.Platform();\r\n            ps.Platform();\r\n<\/pre>\n<p>Tabi ili\u015fkisel s\u0131n\u0131flar ve algoritmada ki ihtiyaca g\u00f6re \u00fcretilmesi gereken s\u0131n\u0131flar \u00fczerinde bu tasar\u0131m desenini uygulamak en do\u011frusudur. Aksi halde di\u011fer s\u0131n\u0131flar\u0131n nesnelerini bu \u015fekilde \u00fcretmeniz daha makuld\u00fcr.<\/p>\n<h3>Interface\u00a0\u0130le Factory Method Design Pattern<\/h3>\n<p>E\u011fer Factory Method tasar\u0131m desenenini interface kullanarak uygulamak istiyorsan\u0131z, &#8220;Oyun&#8221; isimli abstract s\u0131n\u0131f\u0131n\u0131 interface&#8217;e \u00e7evirmeniz yeterlidir. Tabi bu \u00e7evrim s\u0131ras\u0131nda interface kurallar\u0131n\u0131 dikkate almal\u0131 ve oyunlar\u0131 interfaceden t\u00fcretirken yap\u0131lacak implementte override komutu olmadan uygulama ger\u00e7ekle\u015ftirilmelidir.<\/p>\n<p>Interface&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    interface Oyun\r\n    {\r\n        void Platform();\r\n    }\r\n<\/pre>\n<p>Oyunlar&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Atari : Oyun\r\n    {\r\n        public void Platform()\r\n        {\r\n            Console.WriteLine(&quot;Bu oyun ATAR\u0130 platformunda \u00e7al\u0131\u015fmaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class PC : Oyun\r\n    {\r\n        public void Platform()\r\n        {\r\n            Console.WriteLine(&quot;Bu oyun PC platformunda \u00e7al\u0131\u015fmaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class PS : Oyun\r\n    {\r\n        public void Platform()\r\n        {\r\n            Console.WriteLine(&quot;Bu oyun PS platformunda \u00e7al\u0131\u015fmaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Interface ilede Factory Method Design Pattern&#8217;i bu \u015fekilde tasarlanabilmektedir. Yani anlayaca\u011f\u0131n\u0131z abstract class ile olan tasar\u0131mdan, yap\u0131lar\u0131n kendilerine has kullan\u0131m kurallar\u0131 d\u0131\u015f\u0131nda hi\u00e7bir fark yoktur.<\/p>\n<p>Hepinize iyi \u00e7al\u0131\u015fmalar dilerim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>Kaynak : https:\/\/www.youtube.com\/watch?v=ajiT4d2mPzM, http:\/\/www.csharpnedir.com\/articles\/read\/?id=146<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Creational Patterns (Olu\u015fturucu Kal\u0131plar) kategorisine giren Factory Method Design Pattern \u00fczerine detayl\u0131 bir inceleme ger\u00e7ekle\u015ftirece\u011fiz. Factory Metod tasar\u0131m deseni, birbirleriyle ili\u015fkili nesneleri olu\u015fturmam\u0131zda bize olduk\u00e7a alternatif bir metod sunmaktad\u0131r. As\u0131l ama\u00e7, olu\u015fturmak istedi\u011fimiz&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3654,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[931,925,750,929,927,930,926,928],"class_list":["post-3653","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-creater","tag-creational-patterns","tag-design-pattern","tag-factory","tag-factory-method","tag-method","tag-olusturucu-kaliplar","tag-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=3653"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3653\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3654"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}