{"id":3441,"date":"2020-06-06T18:22:13","date_gmt":"2020-06-06T15:22:13","guid":{"rendered":"https:\/\/furkansandal.com\/?p=3441"},"modified":"2020-09-21T16:38:48","modified_gmt":"2020-09-21T13:38:48","slug":"singleton-pattern-nedir-nasil-kullanilir","status":"publish","type":"post","link":"https:\/\/furkansandal.com\/singleton-pattern-nedir-nasil-kullanilir\/","title":{"rendered":"Singleton Pattern Nedir? Nas\u0131l Kullan\u0131l\u0131r?"},"content":{"rendered":"\n


Tasar\u0131m Patterni yaz\u0131l\u0131mc\u0131lar aras\u0131nda kar\u015f\u0131la\u015f\u0131lan problemleri \u00e7\u00f6zmek i\u00e7in kullan\u0131lan deneyimli yaz\u0131l\u0131mc\u0131lar aras\u0131nda deneme yan\u0131lma yoluyla bulunan birer \u00e7\u00f6z\u00fcm y\u00f6ntemleri sistemidir. Genellikle 5 ana ba\u015fl\u0131k alt\u0131nda incelenen Tasar\u0131m patternlerinden bu makalede Creational Pattern (Yarat\u0131c\u0131 Tasar\u0131m Kal\u0131plar\u0131), alt ba\u015fl\u0131klar\u0131ndan Singleton Patternini (Tek Tip Tasar\u0131m Kal\u0131b\u0131) ele alaca\u011f\u0131z.<\/p>\n\n\n\n

\"\"<\/figure><\/div>\n\n\n\n


Creational Pattern (Yarat\u0131c\u0131 Tasar\u0131m Kal\u0131plar\u0131), nesnelerin olu\u015fturulma bi\u00e7imi ile alakal\u0131d\u0131r. Kontroll\u00fc bir \u015fekilde nesneler olu\u015fturarak d\u00fczensizli\u011fi ve karars\u0131zl\u0131\u011f\u0131 minimize ederler.<\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n


Singleton \u015fablonunu, bir uygulaman\u0131n, b\u00fct\u00fcn muhtemel senaryolarda, herhangi aksi bir \u015fart bulunmad\u0131\u011f\u0131 herhangi bir s\u0131n\u0131f\u0131n yaln\u0131zca tek \u00f6rne\u011fine sahip olmas\u0131n\u0131 istedi\u011fi bir tasar\u0131m \u00e7\u00f6z\u00fcm\u00fc olarak tan\u0131mlayabiliriz. Yani Singleton\u2019da tek bir s\u0131n\u0131f tek bir nesnenin olu\u015fturulmas\u0131ndan sorumludur. Ancak bu nesne global olmal\u0131d\u0131r ve di\u011fer t\u00fcm s\u0131n\u0131flar taraf\u0131ndan istenildi\u011finde ula\u015f\u0131labilir \u015fekilde olmal\u0131d\u0131r. Bu sebeple Creational Tasar\u0131m Kal\u0131plar\u0131 i\u00e7inde en basit olan\u0131 bu Singleton tasar\u0131m kal\u0131b\u0131 olarak s\u00f6yleyebiliriz. Yaln\u0131zca bir kez olu\u015fturulacak oldu\u011fundan nesneye ihtiya\u00e7 duyuluncaya kadar yarat\u0131lmam\u0131\u015f olabilir.
Singleton patterninde kendini somutla\u015ft\u0131rmay\u0131 sa\u011flayan tek bir s\u0131n\u0131f i\u00e7erme sebebi birden fazla \u00f6rnek olu\u015fturmad\u0131\u011f\u0131ndan emin olmak i\u00e7indir. \u00d6rne\u011fe genel bir eri\u015fim sa\u011flanmas\u0131 sebebiyle ayn\u0131 \u00f6rnek her zaman kullan\u0131labilir, \u00e7\u00fcnk\u00fc her defas\u0131nda direkt yap\u0131c\u0131ya ula\u015fmak m\u00fcmk\u00fcn de\u011fildir. Global eri\u015fim izinleri her kesin ula\u015fmas\u0131 i\u00e7in kullan\u0131\u015fl\u0131 olsalar bile, bir kod potansiyel olarak bu global de\u011fi\u015fkenlerin i\u00e7eri\u011finin \u00fczerine yaz\u0131l\u0131p uygulanmas\u0131 \u00e7\u00f6kertip zarar verebilece\u011fi i\u00e7in pek de g\u00fcvenli de\u011fillerdir. Di\u011fer patternlerde mevcut olan k\u00fcresel bir de\u011fi\u015fken gibi, Singleton kal\u0131b\u0131 program\u0131n herhangi bir yerinden bir nesneye eri\u015fime olanak tan\u0131r ancak farkl\u0131 olarak burada bu \u00f6rne\u011fin ba\u015fka bir kod taraf\u0131ndan \u00fczerine yaz\u0131lmas\u0131na, de\u011fi\u015ftirilmesine engel olur. Bu sebeple Singleton patterni daha avantajl\u0131 olarak de\u011ferlendirebiliriz. Kodun \u00fczerine eklenenle uygulama \u00e7\u00f6kertmesi d\u0131\u015f\u0131nda sorunu \u00e7\u00f6z\u00fcyor da olabilir ancak \u00e7\u00f6z\u00fcm\u00fc sa\u011flayan kodun program\u0131n her taraf\u0131na t\u00fcm s\u0131n\u0131flara da\u011f\u0131t\u0131lmas\u0131 bu patternle engellenir. Zaten kodun kalan k\u0131sm\u0131 yaln\u0131z bu Singleton patternin oldu\u011fu s\u0131n\u0131fa ba\u011fl\u0131ysa, sadece tek bir s\u0131n\u0131fta yer almak \u00e7ok daha mant\u0131kl\u0131d\u0131r.
Singleton kal\u0131b\u0131 bir\u00e7ok yaz\u0131l\u0131m program\u0131nda kullan\u0131labilir java ba\u015fl\u0131ca olmak \u00fczere PHP, C++, Delphi, Python, Kotlin bunlara \u00f6rnektir. Bu patterni daha iyi anlanmak i\u00e7in kodda kullan\u0131m yap\u0131s\u0131n\u0131 inceleyebiliriz. <\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n

\u00d6ncelikle olu\u015fturulan s\u0131n\u0131f gizlenir. Ard\u0131ndan genel statik hepsinde ge\u00e7erli olan (getInstance()) komutu ile bir i\u015flemle bu s\u0131n\u0131f\u0131n sahip oldu\u011fu tek bir \u00f6rnek tan\u0131mlan\u0131r. Statik y\u00f6ntemin i\u00e7ine lazy initialization (tembel ba\u015flatma) uygulan\u0131r. Yaln\u0131zca ilk \u00e7a\u011fr\u0131da yeni bir nesne olu\u015fturulur ve statik alan i\u00e7ine konulur. Bir defaya mahsus nesne olu\u015fturulduktan sonra bu y\u00f6ntem her zaman sonraki b\u00fct\u00fcn \u00e7a\u011f\u0131rmalarda bu \u00f6rne\u011fi d\u00f6nd\u00fcr\u00fcr. Bu modelde esas olay s\u0131n\u0131f i\u00e7indeki \u00f6rne\u011fin somutla\u015ft\u0131r\u0131l\u0131p bir kez a\u00e7\u0131l\u0131p sonras\u0131nda kendi kontrol\u00fcn\u00fc sa\u011flamas\u0131d\u0131r. Olu\u015fturan (constructer) gizli oldu\u011fu i\u00e7in onun d\u0131\u015f\u0131nda yani s\u0131n\u0131f\u0131n d\u0131\u015f\u0131nca kimsenin nesneyi de\u011fi\u015fterememesini kontrol edememesini sa\u011flar. Bu Singleton patterninde s\u0131n\u0131f ve nesne ad\u0131 (Singleton.getInstance()) operasyonu\/ komutu kullan\u0131larak olu\u015fturulur. <\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n


Kullan\u0131m alanlar\u0131 olarak inceledi\u011fimizde abstract (soyut) factory, factory method, builder (kurucu), ve prototype pattern uygulamalar\u0131nda s\u0131k s\u0131k Singleton patternleri kullan\u0131m\u0131 g\u00f6r\u00fcr\u00fcz. Cephe (facade) nesneleri sadece bir adet olmas\u0131ndan \u00f6t\u00fcr\u00fc burada yayg\u0131nd\u0131r; ayn\u0131 \u015fekilde durum (state) nesnelerinde de kullan\u0131m s\u0131kt\u0131r. Global de\u011fi\u015fkenlerdense Singleton kal\u0131b\u0131 tercih sebebidir; \u00e7\u00fcnk\u00fc di\u011ferleri gibi karma\u015faya sebep olmazlar. Kod i\u00e7inde tekrara d\u00fc\u015fmeleri engeller. Di\u011fer bir\u00e7ok dildeki global de\u011fi\u015fkenler kaynak ve alan kullan\u0131rken, Singleton patternler lazy allocation and initialization (tembel tahsis ve ba\u015flatma) yapmay\u0131 sa\u011flarlar. Bu a\u00e7\u0131dan de\u011ferlendirildi\u011finde karma\u015fa ve kaynak kullan\u0131m\u0131 azalt\u0131lmas\u0131 i\u00e7in Singleton kullan\u0131m\u0131 daha ideal olacakt\u0131r.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"

Tasar\u0131m Patterni yaz\u0131l\u0131mc\u0131lar aras\u0131nda kar\u015f\u0131la\u015f\u0131lan problemleri \u00e7\u00f6zmek i\u00e7in kullan\u0131lan deneyimli yaz\u0131l\u0131mc\u0131lar aras\u0131nda deneme yan\u0131lma yoluyla bulunan birer \u00e7\u00f6z\u00fcm y\u00f6ntemleri sistemidir….<\/p>\n","protected":false},"author":1,"featured_media":3445,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","footnotes":""},"categories":[1,155],"tags":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/furkansandal.com\/wp-content\/uploads\/2020\/06\/singleton.png?fit=640%2C400&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6BM7I-Tv","amp_enabled":true,"_links":{"self":[{"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/posts\/3441"}],"collection":[{"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/comments?post=3441"}],"version-history":[{"count":2,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/posts\/3441\/revisions"}],"predecessor-version":[{"id":3449,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/posts\/3441\/revisions\/3449"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/media\/3445"}],"wp:attachment":[{"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/media?parent=3441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/categories?post=3441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/furkansandal.com\/wp-json\/wp\/v2\/tags?post=3441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}