﻿
{"id":244,"date":"2012-03-19T22:02:21","date_gmt":"2012-03-19T22:02:21","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=244"},"modified":"2012-05-28T13:00:35","modified_gmt":"2012-05-28T13:00:35","slug":"cta-singleton-design-patternsingleton-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-singleton-design-patternsingleton-tasarim-deseni\/","title":{"rendered":"C# Singleton Design Pattern(Singleton Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131mda C#&#8217;ta Singleton Design Pattern kullan\u0131m\u0131n\u0131 anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m.Yaz\u0131l\u0131m d\u00fcnyas\u0131n da bir \u00e7ok tasar\u0131m deseni mevcuttur.Nesnenin olu\u015fturulmas\u0131 ve y\u00f6netilmesiyle ilgili olan Creatinal Patterns grubundan Singleton desenini anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m.Di\u011fer desenlerle ilgili yaz\u0131lar ilerideki zamanlar da haz\u0131rlamay\u0131 d\u00fc\u015f\u00fcn\u00fcyorum.<br \/>\n<!--more--> <span style=\"color: #99cc00;\"><strong>Singleton Deseni<\/strong><\/span><br \/>\nBu yap\u0131da kullan\u0131c\u0131ya kendi ba\u015f\u0131na bir nesne yaratma izni verilmez.Kullan\u0131c\u0131 bizden sadece nesne talep edebilir.Ve bizden nesne talep etti\u011finde de biz ona her defas\u0131nda bellekte var olan nesneyi veririz.B\u00f6ylece kullan\u0131c\u0131 sadece tek bir nesne ile \u00e7al\u0131\u015fmak zorunda kal\u0131r.Yani kullan\u0131c\u0131 bir i\u015f i\u00e7in 50 tane farkl\u0131 nesne \u00fcretemez.<br \/>\nMesela SqlConnection nesnesini baz\u0131 durumlar da \u00e7ok \u00fcretmek zorunda kal\u0131yoruz.Birden fazla SqlConnection nesnesi \u00fcretip belle\u011fe y\u00fck bindirece\u011fimize var olan SqlConnection nesnesi \u00fczerinden i\u015flem yapmam\u0131z performans a\u00e7\u0131s\u0131ndan olumlu olacakt\u0131r.<br \/>\nPeki bu i\u015fi nas\u0131l yapaca\u011f\u0131z?<br \/>\n\u00d6ncelikle kullan\u0131c\u0131ya nesne yaratt\u0131rmam\u0131z gerekti\u011fi bariz ortada.<br \/>\nBunu sa\u011flayabilmek i\u00e7in Constructor private yap\u0131larak, kullan\u0131c\u0131n nesne yaratmas\u0131 engellenir.<br \/>\nKullan\u0131c\u0131 constructor kullanarak nesne yaratamayaca\u011f\u0131 i\u00e7in, nesneyi ona biz vermeliyiz.Bu da ancak o class tipinde bir nesne g\u00f6nderen static bir metod ya da \u00f6zellikle(property) mevcuttur.<br \/>\nKullan\u0131c\u0131ya bu metod ya da property her defas\u0131nda ayn\u0131 nesneyi g\u00f6ndermeli.<br \/>\nBu y\u00fczden metod ya da property i\u00e7inde if kontrol\u00fcyle ayn\u0131 nesneyi g\u00f6ndermeyi sa\u011flayaca\u011f\u0131z.<\/p>\n<p>\u015eimdi ben Singleton.cs ad\u0131nda bir class olu\u015fturuyorum.Ve bu class\u0131 yukarda anlatt\u0131\u011f\u0131m \u015fekilde constructor\u0131n\u0131 private yap\u0131p,Singleton class\u0131ndan nesne olu\u015fturulmas\u0131n\u0131 engelliyorum.Singleton tipinde geri d\u00f6n\u00fc\u015f de\u011feri olan,static bir metod yaz\u0131p kontrollerle her defas\u0131nda ayn\u0131 nesneyi g\u00f6nderiyorum.Bir kereli\u011fine olu\u015fturmaya mahsus.<br \/>\n1.YOL<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Singleton\r\n    {\r\n        private Singleton()\r\n        {\r\n\r\n        }\r\n        private static Singleton nesne;\r\n\/\/static metodun i\u00e7inde bu referans\u0131 kullanabilmemiz i\u00e7in static olmas\u0131 gerekiyor.\r\n\/\/static metodun i\u00e7inde sadece static metodlar kullan\u0131labilir.\r\n        public static Singleton NesneVer()\r\n        {\r\n            if (nesne==null)\r\n            {\r\n                nesnem = new Singleton();\r\n            }\r\n            return nesne;\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu izah edeyim.Bo\u015f constructoru private yaparak ba\u015fka classta new operat\u00f6r\u00fcyle yeni bir nesne yarat\u0131lmas\u0131n\u0131 engelliyoruz.O constructor\u0131 bu classta kullanabiliriz.Bir tane static Singleton tipinde nesnem ad\u0131nda referans olu\u015fturuyoruz.Ama hemen nesneyi ona ba\u011flam\u0131yoruz.\u00c7\u00fcnk\u00fc Singleton tipinde geri d\u00f6nen static metodumuz da kontroll\u00fc bir \u015fekilde ba\u011flayaca\u011f\u0131z.<br \/>\nE\u011fer nesnem ad\u0131ndaki referans\u0131m\u0131z null de\u011ferine sahipse nesnem referans\u0131na bir Singleton nesnesi ba\u011fl\u0131yoruz ve bunu return ediyoruz.<br \/>\n\u015eimdi sunum katman\u0131n da bu s\u0131n\u0131ftan nesne nas\u0131l \u00e7a\u011f\u0131r\u0131yoruz ona bakal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSingleton nesne = new Singleton();\r\n\/\/Bu \u015fekilde nesne olu\u015fturamazs\u0131n\u0131z.Hata al\u0131rs\u0131n\u0131z...\r\nSingleton nesne = Singleton.NesneVer();\r\n\/\/Bu \u015fekilde Singleton d\u00f6nen static metodu \u00e7a\u011f\u0131rarak nesneyi olu\u015fturabilirsiniz.\r\n<\/pre>\n<p>\u015eimdi Singleton.cs s\u0131n\u0131f\u0131ndan iki nesne olu\u015ftural\u0131m.Bakal\u0131m bu s\u0131n\u0131ftan olu\u015fturdu\u011fumuz nesnelerin hepsi bir tek ayn\u0131 nesneyimi g\u00f6steriyor.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSingleton nesne1 = Singleton.NesneVer();\r\nSingleton nesne2 = Singleton.NesneVer();\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi nesne1 ve nesne2 referanslar\u0131na Singleton s\u0131n\u0131f\u0131ndaki NesneVer() static metoduyla nesne verdik.Bakal\u0131m bu iki referansta ayn\u0131 nesneyimi g\u00f6steriyor.<br \/>\nBir \u00e7ok y\u00f6ntemle bunu test edebiliriz.<br \/>\nTest 1<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            if (nesne1==nesne2)\r\n            {\r\n                MessageBox.Show(&quot;Test&quot;);\r\n            }\r\n<\/pre>\n<p>Test 2<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            if (nesne1.Equals(nesne2))\r\n            {\r\n                MessageBox.Show(&quot;Test&quot;);\r\n            }\r\n<\/pre>\n<p>Test 3<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            if (nesne1.GetHashCode()==nesne2.GetHashCode())\r\n            {\r\n                MessageBox.Show(&quot;Test&quot;);\r\n            }\r\n<\/pre>\n<p>GetHashCode() : Bu metot geriye nesnenin bellekteki adresini d\u00f6nd\u00fcr\u00fcr.Dolay\u0131s\u0131yla bu if \u00e7al\u0131\u015f\u0131rsa referanslar ayn\u0131 nesneyi g\u00f6steriyor deriz<br \/>\nYukar\u0131daki herhangi bir test sonucunda mesaj kutusunda &#8220;Test&#8221; yaz\u0131s\u0131n\u0131 g\u00f6receksiniz.<br \/>\nSingleton Design Pattern&#8217;in bir ba\u015fka y\u00f6ntemi de di\u011fer sayfa da anlat\u0131lm\u0131\u015ft\u0131r.<br \/>\n<!--nextpage--><\/p>\n<p>1. sayfa da anlat\u0131lan Singleton Design Pattern y\u00f6netimi , Constructor&#8217;\u0131 private yapt\u0131ktan sonra , geriye Singleton tipinde de\u011fer d\u00f6nen static metodumuz da kontroll\u00fc bir \u015fekilde nesne olu\u015fturup g\u00f6nderiyorduk.E\u011fer nesne yoksa olu\u015fturup g\u00f6nderiyorduk.E\u011fer nesne varsa var olan nesneyi g\u00f6nderiyorduk.<br \/>\n\u015eimdi ise ayn\u0131 mant\u0131kta static property ile \u00e7al\u0131\u015faca\u011f\u0131z.<br \/>\nBu y\u00f6ntemi de Singleton.cs class\u0131nda haz\u0131rlayaca\u011f\u0131m.<br \/>\n2.YOL<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Singleton\r\n    {\r\n        private Singleton()\r\n        { }\r\n        private static Singleton nesnem;\r\n\/\/static yap\u0131 i\u00e7erisinde kullanaca\u011f\u0131m\u0131z i\u00e7in bunun da static olmas\u0131 gerekiyor.\r\n\/\/static yap\u0131larlar i\u00e7inde kullan\u0131lanlar static olmal\u0131d\u0131rlar.\r\n        public static Singleton NesneVer\r\n        {\r\n            get { return nesnem; }\r\n        }\r\n\r\n        static Singleton()\r\n        {\r\n            nesnem = new Singleton();\r\n        }\r\n\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011fundaki mant\u0131\u011fa de\u011fineyim.Constructor\u0131 private yap\u0131larak,d\u0131\u015far\u0131da bu class \u00fczerinden nesne yarat\u0131lmas\u0131n\u0131 engelliyoruz.Singleton tipinde static bir private refenrans olu\u015fturuyorum.Bu referans\u0131 d\u0131\u015far\u0131ya kontroll\u00fc a\u00e7mak i\u00e7in public tipinde gerite Singleton d\u00f6nen statik Nesne adl\u0131 propertymi yaz\u0131yorum.Bu propertyi bize sadece nesneyi g\u00f6nderece\u011fi i\u00e7in set blo\u011funu kald\u0131r\u0131yorum.Sonra static constructor olu\u015fturuyorum.Bu static constructor\u0131n \u00f6zelliklerinden hat\u0131rlarsan\u0131z e\u011fer, static elemanlardan biri \u00e7al\u0131\u015ft\u0131r\u0131lmaya kalk\u0131\u015f\u0131ld\u0131\u011f\u0131 zaman ondan \u00f6nce \u00e7al\u0131\u015f\u0131r.Ve bir kere \u00e7al\u0131\u015f\u0131r.Bir daha \u00e7al\u0131\u015fmaz.Bu sebepten dolay\u0131 Singleton orneknesne = Singleton.Nesne dedi\u011fimiz zaman, ilk static constructor \u00e7al\u0131\u015faca\u011f\u0131 i\u00e7in bir nesne olu\u015fturacakt\u0131r.Ve bu nesneyi Singleton tipteki nesnem referans\u0131na ba\u011flayacakt\u0131r.Ve property sayesinde o nesneyi orneknesne referans\u0131na ba\u011fl\u0131yacakt\u0131r.Singleton s\u0131n\u0131f\u0131ndan ikinci bir nesne olu\u015fturuldu\u011fun da static yap\u0131c\u0131 metodumuz \u00e7al\u0131\u015fmayaca\u011f\u0131 i\u00e7in nesnem referans\u0131na ba\u015fka bir nesne ba\u011flanmayacak ve daha \u00f6nceden var olan nesne property sayesinde g\u00f6nderilecektir.<br \/>\n\u015eimdi Singleton s\u0131n\u0131f\u0131ndan iki nesne \u00e7a\u011f\u0131ral\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Singleton nesnem1 = Singleton.Nesne;\r\n            Singleton nesnem2 = Singleton.Nesne;\r\n\r\n            if (nesnem1.GetHashCode()==nesnem2.GetHashCode())\r\n            {\r\n                MessageBox.Show(&quot;Test&quot;);\r\n            }\r\n<\/pre>\n<p>Yukar\u0131da \u00e7a\u011fr\u0131lan nesnelerin ayn\u0131 olup olmad\u0131\u011f\u0131 denetlenmi\u015ftir.Ve sizde denerseniz &#8220;Test&#8221; yaz\u0131s\u0131n\u0131 g\u00f6receksiniz.Buda bir ispatt\u0131r.<br \/>\n\u015eimdilik bu kadar.Bir sonraki yaz\u0131m da g\u00f6r\u00fc\u015fmek \u00fczere.<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#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>Bu yaz\u0131mda C#&#8217;ta Singleton Design Pattern kullan\u0131m\u0131n\u0131 anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m.Yaz\u0131l\u0131m d\u00fcnyas\u0131n da bir \u00e7ok tasar\u0131m deseni mevcuttur.Nesnenin olu\u015fturulmas\u0131 ve y\u00f6netilmesiyle ilgili olan Creatinal Patterns grubundan Singleton desenini anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m.Di\u011fer desenlerle ilgili yaz\u0131lar ilerideki zamanlar da&#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":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,153],"tags":[750,154],"class_list":["post-244","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c","category-design-pattern","tag-design-pattern","tag-singleton"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/244","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=244"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/244\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}