﻿
{"id":3953,"date":"2016-04-09T23:15:59","date_gmt":"2016-04-09T23:15:59","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3953"},"modified":"2016-04-09T23:21:30","modified_gmt":"2016-04-09T23:21:30","slug":"c-prototype-design-pattern-prototip-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-prototype-design-pattern-prototip-tasarim-deseni\/","title":{"rendered":"C# Prototype Design Pattern &#8211; Prototip Tasar\u0131m Deseni"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu yaz\u0131m\u0131zda Creational Patterns(Olu\u015fturucu Kal\u0131plar) kategorisine giren Prototype Design Pattern \u00fczerine konu\u015faca\u011f\u0131z.<\/p>\n<p>Tasar\u0131m deseni yakla\u015f\u0131mlar\u0131ndan Prototype Design Pattern sayesinde elimizdeki mevcut nesnelerin prototiplerini olu\u015fturabilmekte, birnevi bu nesnelerin kopyalar\u0131n\u0131 elde edebilmekteyiz. Prototip deseninin tasarlanmas\u0131n\u0131n as\u0131l sebebi, ilgili nesne \u00fczerinden ayn\u0131 tipte ba\u015fka bir nesneyi h\u0131zl\u0131ca \u00fcretebilmektir. Haliyle \u00fcretimi esnas\u0131nda maliyetli olabilecek nesneleri(ki burada maliyetten kas\u0131t, parametreli constructer vs. olabilir) var olan nesne \u00fczerinden &#8220;new&#8221; anahtar s\u00f6zc\u00fc\u011f\u00fcn\u00fc kullanmadan bir \u015fekilde olu\u015fturulmas\u0131n\u0131 sa\u011flayabilmektedir.<\/p>\n<p>Biliyoruz ki, <em>Shallow Copy<\/em> ve <em>Deep Copy<\/em> olmak \u00fczere iki t\u00fcr nesne kopyalama i\u015flemi mevcuttur. Shallow Copy ile nesnelerin bellekteki adresleri kopyalanmakta dolay\u0131s\u0131yla y\u00fczeysel olarak bir kopyalama i\u015flemi ger\u00e7ekle\u015ftirilece\u011fi i\u00e7in yeni bir nesne \u00fcretilmemekte, var olan nesne \u00fczerine referanslar ile i\u015faretleme yap\u0131lmaktad\u0131r. Anlayaca\u011f\u0131n\u0131z Shallow Copy, Prototype Design Pattern i\u00e7in uygun tercih olmayacakt\u0131r.<\/p>\n<p>Lakin Deep Copy ile nesneler birebir kopyalanabilmekte ve bu kopya sonucu ile as\u0131l nesne farkl\u0131 referanslar ile i\u015faretlenebilmektedir. \u0130\u015fte Prototype Design Pattern&#8217;de bu kopyalama yakla\u015f\u0131m\u0131nda bulunmak en do\u011frusudur.<\/p>\n<blockquote><p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/\" target=\"_blank\">C#\u2019ta ICloneable Interface\u2019i \u0130le Nesne Kopyalama<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131m\u0131 incelerseniz e\u011fer, ICloneable Interface&#8217;ini kullanarak bir nesne kopyalamay\u0131 inceleyebilirsiniz.<\/p><\/blockquote>\n<p>Prototype Design Pattern&#8217;i uygularken a\u015fa\u011f\u0131daki diyagram mant\u0131\u011f\u0131nda hareket etmekteyiz.<\/p>\n<div id=\"attachment_3959\" style=\"width: 495px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-prototype-design-pattern-prototip-tasarim-deseni\/c-prototype-design-pattern-prototip-tasarim-deseni\/\" rel=\"attachment wp-att-3959\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3959\" class=\"size-full wp-image-3959\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Prototype-Design-Pattern-Prototip-Tasar\u0131m-Deseni.png\" alt=\"C# Prototype Design Pattern - Prototip Tasar\u0131m Deseni\" width=\"485\" height=\"204\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Prototype-Design-Pattern-Prototip-Tasar\u0131m-Deseni.png 485w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/C-Prototype-Design-Pattern-Prototip-Tasar\u0131m-Deseni-300x126.png 300w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><\/a><p id=\"caption-attachment-3959\" class=\"wp-caption-text\">C# Prototype Design Pattern &#8211; Prototip Tasar\u0131m Deseni<\/p><\/div>\n<p>Yukar\u0131daki diyagramda ProtoType bir abstract class yahut interface yap\u0131s\u0131 olabilir. \u0130\u00e7erisinde kendisinden miras al\u0131nan s\u0131n\u0131fa zorla uygulataca\u011f\u0131 Clone metodu mevcuttur. \u0130lgili abstract class veya interface yap\u0131m\u0131zdan t\u00fcreyecek olan s\u0131n\u0131flar\u0131m\u0131zdaki Clone metodu sayesinde maliyetsiz bir \u00fcretim ger\u00e7ekle\u015ftirebilece\u011fiz.<\/p>\n<p>Yani bu diyagram\u0131 net bir \u015fekilde izah etmemiz gerekirse e\u011fer, Prototype Design Pattern&#8217;de \u00fc\u00e7 temel yap\u0131 bulunmaktad\u0131r. Bu yap\u0131lara a\u015fa\u011f\u0131da de\u011finilmi\u015ftir.<\/p>\n<ul>\n<li><em><strong>Soyut\u00a0S\u0131n\u0131f<\/strong><\/em><br \/>\nYeni nesnelerin kopyalanmas\u0131n\u0131 sa\u011flayan ve bu i\u015flem i\u00e7in Clone metodunu bar\u0131nd\u0131ran bir s\u0131n\u0131ft\u0131r. abstract class yahut interface olarak tasarlanabilir.<\/li>\n<li><strong>Somut Prototip Nesneleri<\/strong><br \/>\nSoyut s\u0131n\u0131f\u0131 uygulayacak olan ve projede herhangi bir ama\u00e7 i\u00e7in kullan\u0131lacak olan nesnelerdir. Yani\u00a0Prototype Design Pattern&#8217;i uygulayaca\u011f\u0131m\u0131z projedeki s\u0131n\u0131flar\u0131m\u0131zd\u0131r.<\/li>\n<li><em><strong>\u0130stemci(Client) Uygulama<br \/>\n<\/strong><\/em>Bunu talebi olu\u015fturacak ve deseni kullanacak katman olarak tan\u0131mlayabiliriz.<\/li>\n<\/ul>\n<p>Prototype Design Pattern, tasar\u0131m desenleri aras\u0131nda en kolay mant\u0131\u011f\u0131 ve kullan\u0131m\u0131 bar\u0131nd\u0131ran desendir. Bunun sebebi g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi teorik a\u00e7\u0131dan \u00e7ok kolay olmas\u0131yken, nesnelerin kopyalanmas\u0131 i\u015flemini .NET FrameWork&#8217;\u00fcn sa\u011flamas\u0131 olacakt\u0131r.<\/p>\n<p>\u015eimdi pratikte bir \u00f6rneklendirme yapal\u0131m.<br \/>\n\u00d6rne\u011fimizde amac\u0131m\u0131z bir oyun projesinde oyunlar\u0131m\u0131z\u0131 Prototype Design Pattern uygulayarak \u00fcretmek olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Oyun\r\n    {\r\n        public int OyunID { get; set; }\r\n        public string OyunAdi { get; set; }\r\n        public string OyunTuru { get; set; }\r\n        public bool Durum { get; set; }\r\n        public Oyun(int OyunID, string OyunAdi, string OyunTuru, bool Durum)\r\n        {\r\n            this.OyunID = OyunID;\r\n            this.OyunAdi = OyunAdi;\r\n            this.OyunTuru = OyunTuru;\r\n            this.Durum = Durum;\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi yukar\u0131da &#8220;Oyun&#8221; s\u0131n\u0131f\u0131m\u0131z\u0131 tan\u0131mlam\u0131\u015f bulunmaktay\u0131z ve bu s\u0131n\u0131ftan parametreli constructer ile nesne yarat\u0131lmaktad\u0131r. \u0130\u015fte maliyetten bahsetti\u011fimiz durum budur ki, ben bir &#8220;Oyun&#8221; nesnesi yaratmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131mda new Oyun(3,&#8221;Oyun Ad\u0131&#8221;,&#8221;Oyun T\u00fcr\u00fc&#8221;,true) gibi bir parametrik kod zorunlulu\u011fu getirmektedir. Haliyle kodsal maliyet bu s\u0131n\u0131f\u0131n new keyword\u00fc ile nesne \u00fcretiminde artt\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    abstract class PrototypeOyun\r\n    {\r\n        public abstract PrototypeOyun Clone();\r\n    }\r\n<\/pre>\n<p>Soyut s\u0131n\u0131f\u0131m\u0131z tan\u0131mlanarak i\u00e7ine gene ayn\u0131 tipte d\u00f6nen Clone metodu eklenmi\u015ftir. &#8220;Oyun&#8221; s\u0131n\u0131f\u0131m\u0131z\u0131 bu soyut s\u0131n\u0131ftan t\u00fcretti\u011fimiz zaman, ilgili &#8220;Oyun&#8221; nesnesini Clone metodu ile kopyalayacak ve \u00e7ok bi\u00e7imlilik ile &#8220;PrototypeOyun&#8221; tipinde bir referansa atayabilece\u011fiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Oyun : PrototypeOyun\r\n    {\r\n        public int OyunID { get; set; }\r\n        public string OyunAdi { get; set; }\r\n        public string OyunTuru { get; set; }\r\n        public bool Durum { get; set; }\r\n        public Oyun(int OyunID, string OyunAdi, string OyunTuru, bool Durum)\r\n        {\r\n            this.OyunID = OyunID;\r\n            this.OyunAdi = OyunAdi;\r\n            this.OyunTuru = OyunTuru;\r\n            this.Durum = Durum;\r\n        }\r\n\r\n        public override PrototypeOyun Clone()\r\n        {\r\n            return this.MemberwiseClone() as PrototypeOyun;\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer soyut s\u0131n\u0131f\u0131m\u0131zdan t\u00fcretilen &#8220;Oyun&#8221; s\u0131n\u0131f\u0131 Clone metodunu implement etmi\u015ftir. O anki nesnenin MemberwiseClone metodu ile bir kopyas\u0131 olu\u015fturularak &#8220;PrototypeOyun&#8221; tipinde geri g\u00f6nderilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Oyun o1 = new Oyun(3, &quot;Oyun Ad\u0131&quot;, &quot;Oyun T\u00fcr\u00fc&quot;, true);\r\n            Oyun o2 = (Oyun)o1.Clone();\r\n\r\n            if (o1.Equals(o2))\r\n            {\r\n                Console.WriteLine(&quot;E\u015fit&quot;);\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(&quot;De\u011fil&quot;);\r\n            }\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>En son Client(\u0130stemci) taraf\u0131ndan bir talep ger\u00e7ekle\u015ftirilmi\u015ftir. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ikinci nesneyi new keyword\u00fc ile olu\u015fturmaya kalkmayarak maliyeti g\u00f6z ard\u0131 edip, var olan nesne \u00fczerinden kopyalama i\u015flemi ger\u00e7ekle\u015ftirebiliyoruz.<\/p>\n<p>Burada dikkat etmeniz gereken husus, Prototype tasar\u0131m desenini uygulayabilmek i\u00e7in ilgili s\u0131n\u0131ftan \u00f6ncelikle new keyword\u00fc ile bir nesne \u00fcretilmeli, ard\u0131ndan desenimiz \u00fczerinden kopya \u00fcretimi tetiklenmelidir.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/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, Bu yaz\u0131m\u0131zda Creational Patterns(Olu\u015fturucu Kal\u0131plar) kategorisine giren Prototype Design Pattern \u00fczerine konu\u015faca\u011f\u0131z. Tasar\u0131m deseni yakla\u015f\u0131mlar\u0131ndan Prototype Design Pattern sayesinde elimizdeki mevcut nesnelerin prototiplerini olu\u015fturabilmekte, birnevi bu nesnelerin kopyalar\u0131n\u0131 elde edebilmekteyiz. Prototip deseninin tasarlanmas\u0131n\u0131n&#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":3959,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[1024,750,1023,1050,1049,1022,928],"class_list":["post-3953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-deep-copy","tag-design-pattern","tag-memberwiseclone","tag-prototip-tasarim-deseni","tag-prototype-design-pattern","tag-shallow-copy","tag-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3953","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=3953"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3959"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}