{"id":39541,"date":"2026-02-23T18:40:45","date_gmt":"2026-02-23T15:40:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39541"},"modified":"2026-02-23T18:40:45","modified_gmt":"2026-02-23T15:40:45","slug":"javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/","title":{"rendered":"JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede, belirli bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin (instance) olmas\u0131n\u0131 ve bu tek \u00f6rne\u011fe k\u00fcresel bir eri\u015fim noktas\u0131 sa\u011flamay\u0131 gerektiren durumlarla s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131r\u0131z. \u0130\u015fte bu senaryolarda devreye giren tasar\u0131m deseni, &#8220;Singleton&#8221; olarak adland\u0131r\u0131l\u0131r. Singleton, GoF (Gang of Four) taraf\u0131ndan tan\u0131mlanan en bilinen ve en tart\u0131\u015fmal\u0131 tasar\u0131m desenlerinden biridir. Bu makalede, JavaScript ba\u011flam\u0131nda Singleton tasar\u0131m deseninin ne oldu\u011funu, nas\u0131l uyguland\u0131\u011f\u0131n\u0131, avantajlar\u0131n\u0131, dezavantajlar\u0131n\u0131 ve ne zaman kullan\u0131lmas\u0131 gerekti\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f: Singleton Tasar\u0131m Deseni Nedir?<\/h3>\n<p>Yaz\u0131l\u0131m tasar\u0131m desenleri, belirli bir ba\u011flamda tekrar eden sorunlara kan\u0131tlanm\u0131\u015f \u00e7\u00f6z\u00fcmler sunan genel ve yeniden kullan\u0131labilir yakla\u015f\u0131mlard\u0131r. Bu desenler, kodun daha s\u00fcrd\u00fcr\u00fclebilir, \u00f6l\u00e7eklenebilir ve anla\u015f\u0131l\u0131r olmas\u0131na yard\u0131mc\u0131 olur. Singleton, &#8220;yarat\u0131msal&#8221; (creational) desenler kategorisine girer ve temel amac\u0131, bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin olu\u015fturulmas\u0131n\u0131 garanti etmektir. Bu, \u00f6zellikle kaynak y\u00f6netimi, konfig\u00fcrasyon ayarlar\u0131 veya loglama gibi tek bir merkezi varl\u0131\u011f\u0131n t\u00fcm uygulama taraf\u0131ndan payla\u015f\u0131lmas\u0131 gereken durumlarda kritik \u00f6neme sahiptir.<\/p>\n<p>Bir uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca sadece bir veritaban\u0131 ba\u011flant\u0131 havuzu, bir konfig\u00fcrasyon y\u00f6neticisi veya bir olay yay\u0131c\u0131 olmas\u0131n\u0131 istedi\u011fimizde, bu varl\u0131klar\u0131n birden fazla \u00f6rne\u011finin olu\u015fturulmas\u0131 gereksiz karma\u015f\u0131kl\u0131\u011fa, kaynak israf\u0131na ve potansiyel tutars\u0131zl\u0131klara yol a\u00e7abilir. Singleton deseni, bu t\u00fcr durumlar\u0131 ele almak i\u00e7in tasarlanm\u0131\u015ft\u0131r. JavaScript, nesne tabanl\u0131 programlama paradigmas\u0131n\u0131 tam olarak uygulayan bir dil olmasa da (prototip tabanl\u0131d\u0131r), s\u0131n\u0131f benzeri yap\u0131lar ve mod\u00fcl sistemleri arac\u0131l\u0131\u011f\u0131yla Singleton desenini etkili bir \u015fekilde uygulaman\u0131n \u00e7e\u015fitli yollar\u0131n\u0131 sunar.<\/p>\n<h3>Singleton&#8217;\u0131n Temel Prensipleri ve Yap\u0131s\u0131<\/h3>\n<p>Singleton tasar\u0131m deseninin arkas\u0131ndaki temel prensipler olduk\u00e7a basittir ancak uygulan\u0131\u015f\u0131, dilin \u00f6zelliklerine g\u00f6re farkl\u0131l\u0131k g\u00f6sterebilir. \u0130\u015fte Singleton&#8217;\u0131n olmazsa olmaz \u00fc\u00e7 prensibi:<\/p>\n<ol>\n<li><strong>Tek \u00d6rnek (Single Instance):<\/strong> Bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011fi olmal\u0131d\u0131r. Bu, s\u0131n\u0131f\u0131n yap\u0131c\u0131 metoduna d\u0131\u015far\u0131dan eri\u015fimi k\u0131s\u0131tlayarak ve i\u00e7sel olarak \u00f6rne\u011fin zaten var olup olmad\u0131\u011f\u0131n\u0131 kontrol ederek sa\u011flan\u0131r.<\/li>\n<li><strong>K\u00fcresel Eri\u015fim (Global Access):<\/strong> Uygulaman\u0131n herhangi bir yerinden bu tek \u00f6rne\u011fe kolayca eri\u015filebilmelidir. Genellikle bu, \u00f6rne\u011fi d\u00f6nd\u00fcren statik bir metot veya bir mod\u00fcl d\u0131\u015fa aktar\u0131m\u0131 arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r.<\/li>\n<li><strong>Yap\u0131c\u0131y\u0131 Gizleme (Hidden Constructor):<\/strong> Do\u011frudan <code>new ClassName()<\/code> \u015feklinde yeni bir \u00f6rnek olu\u015fturulmas\u0131n\u0131 engellemek esast\u0131r. Bu, \u00f6rne\u011fin olu\u015fturulmas\u0131n\u0131 yaln\u0131zca Singleton deseni taraf\u0131ndan kontrol edilen mekanizmaya b\u0131rak\u0131r.<\/li>\n<\/ol>\n<p>Bu prensipler, Singleton&#8217;\u0131n temel yap\u0131s\u0131n\u0131 olu\u015fturur. JavaScript&#8217;te bu prensipleri uygulaman\u0131n farkl\u0131 yollar\u0131 vard\u0131r ve her bir yakla\u015f\u0131m\u0131n kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 bulunur.<\/p>\n<h3>JavaScript&#8217;te Singleton Uygulama Y\u00f6ntemleri<\/h3>\n<p>JavaScript&#8217;in evrimiyle birlikte Singleton desenini uygulaman\u0131n farkl\u0131 yollar\u0131 ortaya \u00e7\u0131km\u0131\u015ft\u0131r. Her bir y\u00f6ntem, dilin belirli \u00f6zelliklerinden yararlan\u0131r.<\/p>\n<h4>ES5 Yakla\u015f\u0131m\u0131: Kapan\u0131\u015flar (Closures) ve IIFE (Immediately Invoked Function Expression) Kullan\u0131m\u0131<\/h4>\n<p>ES5 ve \u00f6ncesinde, JavaScript&#8217;te resmi bir s\u0131n\u0131f yap\u0131s\u0131 bulunmad\u0131\u011f\u0131 i\u00e7in Singleton deseni genellikle kapan\u0131\u015flar (closures) ve hemen \u00e7a\u011fr\u0131lan fonksiyon ifadeleri (IIFE &#8211; Immediately Invoked Function Expression) kullan\u0131larak uygulan\u0131rd\u0131. Bu yakla\u015f\u0131m, \u00f6zel de\u011fi\u015fkenleri ve fonksiyonlar\u0131 bir kapsam i\u00e7inde gizleyerek d\u0131\u015far\u0131dan eri\u015fimi k\u0131s\u0131tlaman\u0131n g\u00fc\u00e7l\u00fc bir yolunu sunar.<\/p>\n<pre><code class=\"language-javascript\">\nconst Singleton = (function() {\n    let instance; \/\/ Bu, Singleton \u00f6rne\u011fini tutacak \u00f6zel bir de\u011fi\u015fkendir.\n\n    function createInstance() {\n        \/\/ Singleton \u00f6rne\u011fi olu\u015fturma mant\u0131\u011f\u0131 buraya gelir.\n        \/\/ \u00d6rne\u011fin, bir konfig\u00fcrasyon nesnesi veya bir veritaban\u0131 ba\u011flant\u0131s\u0131.\n        const object = new Object(\"I am the instance\");\n        console.log(\"Yeni bir Singleton \u00f6rne\u011fi olu\u015fturuldu.\");\n        return object;\n    }\n\n    return {\n        getInstance: function() {\n            if (!instance) {\n                instance = createInstance(); \/\/ E\u011fer \u00f6rnek yoksa, olu\u015ftur.\n            }\n            return instance; \/\/ Var olan \u00f6rne\u011fi d\u00f6nd\u00fcr.\n        }\n    };\n})();\n\n\/\/ Kullan\u0131m\nconst instance1 = Singleton.getInstance();\nconst instance2 = Singleton.getInstance();\n\nconsole.log(instance1 === instance2); \/\/ true d\u00f6ner, \u00e7\u00fcnk\u00fc ayn\u0131 \u00f6rnektirler.\nconsole.log(instance1); \/\/ \"I am the instance\" i\u00e7eren bir Object d\u00f6nd\u00fcr\u00fcr.\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, bir IIFE kullanarak bir fonksiyon kapsam\u0131 olu\u015fturulur. <code>instance<\/code> de\u011fi\u015fkeni ve <code>createInstance<\/code> fonksiyonu bu kapsam i\u00e7inde gizlenir. D\u0131\u015far\u0131ya sadece <code>getInstance<\/code> metodu a\u00e7\u0131l\u0131r. <code>getInstance<\/code> metodu, <code>instance<\/code> de\u011fi\u015fkeninin daha \u00f6nce olu\u015fturulup olu\u015fturulmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer olu\u015fturulmam\u0131\u015fsa, <code>createInstance<\/code> fonksiyonunu \u00e7a\u011f\u0131r\u0131r ve yeni bir \u00f6rnek olu\u015fturur. Aksi takdirde, var olan \u00f6rne\u011fi d\u00f6nd\u00fcr\u00fcr. Bu, Singleton&#8217;\u0131n temel prensiplerini ba\u015far\u0131yla uygular.<\/p>\n<h4>ES6 S\u0131n\u0131flar\u0131 (Classes) ile Singleton<\/h4>\n<p>ES6 ile birlikte JavaScript&#8217;e gelen <code>class<\/code> anahtar kelimesi, nesne tabanl\u0131 programlamaya daha tan\u0131d\u0131k bir s\u00f6zdizimi getirmi\u015ftir. Bu yap\u0131, Singleton desenini daha geleneksel bir \u015fekilde uygulamam\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\nclass SingletonClass {\n    constructor() {\n        if (SingletonClass.instance) {\n            \/\/ E\u011fer zaten bir \u00f6rnek varsa, hata f\u0131rlat veya mevcut \u00f6rne\u011fi d\u00f6nd\u00fcr.\n            \/\/ Bu, d\u0131\u015far\u0131dan 'new SingletonClass()' \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda birden fazla \u00f6rnek olu\u015fmas\u0131n\u0131 engeller.\n            return SingletonClass.instance;\n        }\n        \/\/ Singleton \u00f6rne\u011fi olu\u015fturma mant\u0131\u011f\u0131 buraya gelir.\n        this.data = \"Ben Singleton s\u0131n\u0131f\u0131n\u0131n tek \u00f6rne\u011fiyim!\";\n        SingletonClass.instance = this; \/\/ Olu\u015fturulan \u00f6rne\u011fi statik bir de\u011fi\u015fkene kaydet.\n        console.log(\"Yeni bir SingletonClass \u00f6rne\u011fi olu\u015fturuldu.\");\n    }\n\n    \/\/ Statik metot, mevcut \u00f6rne\u011fi d\u00f6nd\u00fcrmek i\u00e7in\n    static getInstance() {\n        if (!SingletonClass.instance) {\n            SingletonClass.instance = new SingletonClass();\n        }\n        return SingletonClass.instance;\n    }\n\n    \/\/ \u00d6rnek metotlar\u0131\n    showData() {\n        console.log(this.data);\n    }\n}\n\n\/\/ Kullan\u0131m\nconst instanceA = SingletonClass.getInstance();\nconst instanceB = SingletonClass.getInstance();\n\nconsole.log(instanceA === instanceB); \/\/ true\ninstanceA.showData(); \/\/ \"Ben Singleton s\u0131n\u0131f\u0131n\u0131n tek \u00f6rne\u011fiyim!\"\n\n\/\/ Do\u011frudan 'new' ile \u00f6rnek olu\u015fturmaya \u00e7al\u0131\u015fmak (baz\u0131 durumlarda yine de m\u00fcmk\u00fcn olabilir\n\/\/ ancak yukar\u0131daki constructor kontrol\u00fc ile ayn\u0131 \u00f6rne\u011fi d\u00f6nd\u00fcrmesi sa\u011flan\u0131r.)\nconst instanceC = new SingletonClass(); \/\/ E\u011fer constructor i\u00e7inde kontrol yoksa, yeni bir \u00f6rnek olu\u015fabilirdi.\n                                       \/\/ Ancak bizim \u00f6rne\u011fimizde, SingletonClass.instance'\u0131 d\u00f6nd\u00fcrecektir.\nconsole.log(instanceA === instanceC); \/\/ true\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131mda, <code>SingletonClass.instance<\/code> ad\u0131nda statik bir \u00f6zellik kullan\u0131l\u0131r. <code>constructor<\/code> metodu, bu statik \u00f6zelli\u011fin zaten bir de\u011fer i\u00e7erip i\u00e7ermedi\u011fini kontrol eder. E\u011fer i\u00e7eriyorsa, mevcut \u00f6rne\u011fi d\u00f6nd\u00fcr\u00fcr. Aksi takdirde, yeni bir \u00f6rnek olu\u015fturur ve bunu <code>SingletonClass.instance<\/code>&#8216;a atar. <code>getInstance<\/code> statik metodu, d\u0131\u015far\u0131dan bu tek \u00f6rne\u011fe eri\u015fim noktas\u0131 sa\u011flar ve \u00f6rne\u011fin varl\u0131\u011f\u0131n\u0131 kontrol ederek gerekti\u011finde yenisini olu\u015fturur.<\/p>\n<h4>Mod\u00fcl Yakla\u015f\u0131m\u0131 (Module Pattern) ile Singleton (Modern JavaScript)<\/h4>\n<p>Modern JavaScript&#8217;te (ES Modules veya CommonJS), mod\u00fcllerin do\u011fas\u0131 gere\u011fi zaten Singleton benzeri bir davran\u0131\u015f sergiledi\u011fini belirtmek \u00f6nemlidir. Bir mod\u00fcl, ilk kez y\u00fcklendi\u011finde bir kez \u00e7al\u0131\u015f\u0131r ve bu mod\u00fclden d\u0131\u015fa aktar\u0131lan herhangi bir nesne veya de\u011fer, o mod\u00fcl\u00fc i\u00e7e aktaran her yer i\u00e7in ayn\u0131 \u00f6rnektir.<\/p>\n<p>Bu, Singleton desenini uygulaman\u0131n en temiz ve en &#8220;JavaScript-vari&#8221; yollar\u0131ndan biridir. Sadece bir nesne olu\u015fturup bunu mod\u00fcl\u00fcn d\u0131\u015f\u0131na aktarman\u0131z yeterlidir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ loggerService.js dosyas\u0131\nclass Logger {\n    constructor() {\n        if (Logger.instance) {\n            return Logger.instance;\n        }\n        this.logs = [];\n        Logger.instance = this;\n        console.log(\"Logger servisi ba\u015flat\u0131ld\u0131.\");\n    }\n\n    log(message) {\n        const timestamp = new Date().toISOString();\n        this.logs.push(<code>[${timestamp}] ${message}<\/code>);\n        console.log(<code>[LOG] ${message}<\/code>);\n    }\n\n    getLogs() {\n        return this.logs;\n    }\n}\n\n\/\/ Mod\u00fcl d\u0131\u015f\u0131na tek bir Logger \u00f6rne\u011fini aktar.\n\/\/ Mod\u00fcl ilk y\u00fcklendi\u011finde bu kod bir kez \u00e7al\u0131\u015f\u0131r ve 'loggerInstance' olu\u015fturulur.\n\/\/ Her 'import' edildi\u011finde ayn\u0131 'loggerInstance' d\u00f6nd\u00fcr\u00fcl\u00fcr.\nconst loggerInstance = new Logger();\nObject.freeze(loggerInstance); \/\/ Singleton'\u0131 daha sa\u011flam hale getirmek i\u00e7in dondurabiliriz.\nexport default loggerInstance;\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ componentA.js dosyas\u0131\nimport Logger from '.\/loggerService.js';\n\nfunction doSomethingInA() {\n    Logger.log(\"Component A'dan bir olay ger\u00e7ekle\u015fti.\");\n}\n\nexport default doSomethingInA;\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ componentB.js dosyas\u0131\nimport Logger from '.\/loggerService.js';\n\nfunction doSomethingInB() {\n    Logger.log(\"Component B'den bir ba\u015fka olay.\");\n}\n\nexport default doSomethingInB;\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ main.js dosyas\u0131\nimport Logger from '.\/loggerService.js';\nimport doSomethingInA from '.\/componentA.js';\nimport doSomethingInB from '.\/componentB.js';\n\ndoSomethingInA();\ndoSomethingInB();\nLogger.log(\"Ana uygulamadan son bir mesaj.\");\n\nconsole.log(\"T\u00fcm loglar:\", Logger.getLogs());\n\/\/ \u00c7\u0131kt\u0131, t\u00fcm bile\u015fenlerden gelen loglar\u0131 i\u00e7erecektir, \u00e7\u00fcnk\u00fc hepsi ayn\u0131 Logger \u00f6rne\u011fini kullan\u0131r.\n<\/code><\/pre>\n<p>Bu mod\u00fcl tabanl\u0131 yakla\u015f\u0131m, modern JavaScript geli\u015ftirme i\u00e7in tercih edilen y\u00f6ntemdir. Mod\u00fcl sistemi, bir mod\u00fcl\u00fcn i\u00e7eri\u011finin sadece bir kez de\u011ferlendirilmesini garanti ederek Singleton davran\u0131\u015f\u0131n\u0131 do\u011fal olarak sa\u011flar. <code>Object.freeze()<\/code> kullan\u0131m\u0131, Singleton \u00f6rne\u011finin d\u0131\u015far\u0131dan de\u011fi\u015ftirilmesini (yeni \u00f6zellikler ekleme, mevcut \u00f6zellikleri de\u011fi\u015ftirme) engelleyerek daha sa\u011flam hale getirir.<\/p>\n<h3>Singleton Kullan\u0131m Senaryolar\u0131 ve Pratik \u00d6rnekler<\/h3>\n<p>Singleton deseni, belirli senaryolarda olduk\u00e7a faydal\u0131 olabilir. \u0130\u015fte yayg\u0131n kullan\u0131m alanlar\u0131ndan baz\u0131lar\u0131:<\/p>\n<h4>Konfig\u00fcrasyon Y\u00f6neticisi (Configuration Manager)<\/h4>\n<p>Uygulama genelindeki ayarlar\u0131 (API anahtarlar\u0131, veritaban\u0131 ba\u011flant\u0131 dizeleri vb.) tek bir yerden y\u00f6netmek i\u00e7in idealdir. T\u00fcm bile\u015fenler ayn\u0131 konfig\u00fcrasyon \u00f6rne\u011fine eri\u015ferek tutarl\u0131 ayarlar kullan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ configManager.js\nclass ConfigManager {\n    constructor() {\n        if (ConfigManager.instance) {\n            return ConfigManager.instance;\n        }\n        this.settings = {\n            apiUrl: \"https:\/\/api.example.com\",\n            timeout: 5000,\n            debugMode: true\n        };\n        ConfigManager.instance = this;\n        console.log(\"ConfigManager ba\u015flat\u0131ld\u0131.\");\n    }\n\n    getSetting(key) {\n        return this.settings[key];\n    }\n\n    setSetting(key, value) {\n        \/\/ Genellikle konfig\u00fcrasyonlar \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirilmez.\n        \/\/ Ama gerekirse bu metot eklenebilir.\n        this.settings[key] = value;\n    }\n}\n\nexport default new ConfigManager();\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ appModule.js\nimport Config from '.\/configManager.js';\n\nconsole.log(\"API URL:\", Config.getSetting(\"apiUrl\"));\n\/\/ Di\u011fer mod\u00fcllerde de ayn\u0131 Config \u00f6rne\u011fi kullan\u0131lacakt\u0131r.\n<\/code><\/pre>\n<h4>Loglama Servisi (Logger Service)<\/h4>\n<p>T\u00fcm uygulama boyunca log mesajlar\u0131n\u0131 toplamak ve belirli bir hedefe (konsol, dosya, uzak sunucu) g\u00f6ndermek i\u00e7in merkezi bir loglama servisi olarak kullan\u0131labilir. Yukar\u0131daki mod\u00fcl tabanl\u0131 \u00f6rnek zaten bir loglama servisi \u00f6rne\u011fiydi.<\/p>\n<h4>Olay Yay\u0131c\u0131\/Dinleyici (Event Emitter\/Listener)<\/h4>\n<p>Uygulama genelinde bile\u015fenler aras\u0131 ileti\u015fimi sa\u011flamak i\u00e7in merkezi bir olay yay\u0131c\u0131 (event emitter) kullan\u0131labilir. T\u00fcm bile\u015fenler ayn\u0131 yay\u0131c\u0131 \u00f6rne\u011fi \u00fczerinden olaylar\u0131 yay\u0131mlar ve dinler.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ eventEmitter.js\nclass EventEmitter {\n    constructor() {\n        if (EventEmitter.instance) {\n            return EventEmitter.instance;\n        }\n        this.events = {};\n        EventEmitter.instance = this;\n        console.log(\"EventEmitter ba\u015flat\u0131ld\u0131.\");\n    }\n\n    on(eventName, listener) {\n        if (!this.events[eventName]) {\n            this.events[eventName] = [];\n        }\n        this.events[eventName].push(listener);\n    }\n\n    emit(eventName, data) {\n        if (this.events[eventName]) {\n            this.events[eventName].forEach(listener => listener(data));\n        }\n    }\n}\n\nexport default new EventEmitter();\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ componentA.js\nimport eventBus from '.\/eventEmitter.js';\n\neventBus.on('dataLoaded', (data) => {\n    console.log(\"Component A: Veri y\u00fcklendi!\", data);\n});\n\nfunction loadData() {\n    console.log(\"Component A: Veri y\u00fckleniyor...\");\n    setTimeout(() => {\n        eventBus.emit('dataLoaded', { user: 'Alice', id: 1 });\n    }, 1000);\n}\n\nexport { loadData };\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ componentB.js\nimport eventBus from '.\/eventEmitter.js';\n\neventBus.on('dataLoaded', (data) => {\n    console.log(\"Component B: Veri y\u00fcklendi ve i\u015fleniyor!\", data);\n});\n\neventBus.on('userAction', (action) => {\n    console.log(\"Component B: Kullan\u0131c\u0131 eylemi alg\u0131land\u0131:\", action);\n});\n\nfunction performAction() {\n    eventBus.emit('userAction', 'Butona T\u0131kland\u0131');\n}\n\nexport { performAction };\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\n\/\/ main.js\nimport { loadData } from '.\/componentA.js';\nimport { performAction } from '.\/componentB.js';\nimport eventBus from '.\/eventEmitter.js'; \/\/ Sadece referans i\u00e7in, asl\u0131nda zaten kullan\u0131l\u0131yor\n\nloadData();\nperformAction();\n<\/code><\/pre>\n<h3>Singleton&#8217;\u0131n Avantajlar\u0131 ve Dezavantajlar\u0131<\/h3>\n<p>Her tasar\u0131m deseni gibi, Singleton&#8217;\u0131n da kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r. Bu dengeyi anlamak, do\u011fru kullan\u0131m kararlar\u0131n\u0131 vermede kritik \u00f6neme sahiptir.<\/p>\n<h4>Avantajlar\u0131<\/h4>\n<ol>\n<li><strong>Kontroll\u00fc Tek \u00d6rnek:<\/strong> Bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin olmas\u0131n\u0131 kesinlikle garanti eder, bu da kaynak y\u00f6netimi ve tutarl\u0131l\u0131k a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/li>\n<li><strong>K\u00fcresel Eri\u015fim Noktas\u0131:<\/strong> Uygulaman\u0131n herhangi bir yerinden bu tek \u00f6rne\u011fe kolayca eri\u015fim sa\u011flar. Bu, genellikle bir servis bulucu (service locator) gibi davranarak sistemin di\u011fer k\u0131s\u0131mlar\u0131na merkezi bir eri\u015fim noktas\u0131 sunar.<\/li>\n<li><strong>Kaynak Y\u00f6netimi:<\/strong> Bellek, dosya tan\u0131t\u0131c\u0131lar\u0131, a\u011f ba\u011flant\u0131lar\u0131 veya veritaban\u0131 ba\u011flant\u0131lar\u0131 gibi pahal\u0131 kaynaklar\u0131n birden fazla kez olu\u015fturulmas\u0131n\u0131 \u00f6nler, b\u00f6ylece kaynak israf\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Tutarl\u0131l\u0131k:<\/strong> Uygulama genelinde payla\u015f\u0131lan durumun (\u00f6rne\u011fin, konfig\u00fcrasyon ayarlar\u0131) tek bir merkezi yerden y\u00f6netilmesini sa\u011flayarak tutars\u0131zl\u0131k riskini azalt\u0131r.<\/li>\n<li><strong>Gecikmeli Ba\u015flatma (Lazy Initialization):<\/strong> \u00d6rnek, yaln\u0131zca ilk kez ihtiya\u00e7 duyuldu\u011funda olu\u015fturulur. Bu, uygulaman\u0131n ba\u015flang\u0131\u00e7 performans\u0131n\u0131 iyile\u015ftirebilir, \u00e7\u00fcnk\u00fc gereksiz nesnelerin erken olu\u015fturulmas\u0131n\u0131 engeller.<\/li>\n<\/ol>\n<h4>Dezavantajlar\u0131<\/h4>\n<ol>\n<li><strong>K\u00fcresel Durum (Global State) Sorunlar\u0131:<\/strong> Belki de Singleton&#8217;\u0131n en b\u00fcy\u00fck dezavantaj\u0131, k\u00fcresel duruma yol a\u00e7mas\u0131d\u0131r. K\u00fcresel durum, kodun ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 gizler, beklenmedik yan etkilere neden olabilir ve uygulaman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Bir Singleton&#8217;\u0131n durumu uygulaman\u0131n herhangi bir yerinden de\u011fi\u015ftirilebilece\u011fi i\u00e7in, hatalar\u0131n izini s\u00fcrmek zorla\u015f\u0131r.<\/li>\n<li><strong>Test Edilebilirli\u011fi D\u00fc\u015f\u00fcr\u00fcr:<\/strong> Singleton&#8217;lar, mod\u00fcler test yazmay\u0131 zorla\u015ft\u0131r\u0131r. Testler aras\u0131nda Singleton&#8217;\u0131n durumu kal\u0131c\u0131 olabilir ve bu da testlerin izole olmas\u0131n\u0131 engeller. Her test ko\u015fmadan \u00f6nce Singleton&#8217;\u0131n durumunu s\u0131f\u0131rlamak veya mock&#8217;lamak genellikle karma\u015f\u0131k bir i\u015ftir. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi alternatifler, bu sorunu \u00e7\u00f6zer.<\/li>\n<li><strong>Tek Sorumluluk \u0130lkesini (SRP) \u0130hlal Edebilir:<\/strong> Singleton, hem kendi \u00f6rne\u011fini y\u00f6netme sorumlulu\u011funa hem de as\u0131l i\u015f mant\u0131\u011f\u0131na sahip olabilir. Bu, s\u0131n\u0131f\u0131n birden fazla sorumlulu\u011fu oldu\u011fu anlam\u0131na gelir ve SRP&#8217;yi ihlal eder.<\/li>\n<li><strong>Esneklik Eksikli\u011fi:<\/strong> Bir Singleton&#8217;\u0131 tasarlad\u0131ktan sonra, uygulaman\u0131n daha sonra birden fazla \u00f6rne\u011fe ihtiya\u00e7 duymas\u0131 durumunda (\u00f6rne\u011fin, farkl\u0131 konfig\u00fcrasyonlarla \u00e7al\u0131\u015fan birden fazla servis), Singleton yap\u0131s\u0131n\u0131 de\u011fi\u015ftirmek zor ve maliyetli olabilir.<\/li>\n<li><strong>\u00c7oklu \u0130\u015f Par\u00e7ac\u0131\u011f\u0131 Sorunlar\u0131 (JavaScript i\u00e7in daha az):<\/strong> Geleneksel olarak, \u00e7oklu i\u015f par\u00e7ac\u0131kl\u0131 dillerde (Java, C# gibi) Singleton&#8217;\u0131n do\u011fru bir \u015fekilde uygulanmas\u0131, e\u015fzamanl\u0131l\u0131k (concurrency) sorunlar\u0131 nedeniyle dikkatli senkronizasyon gerektirir. JavaScript tek i\u015f par\u00e7ac\u0131kl\u0131 oldu\u011fu i\u00e7in bu \u00f6zel sorun daha az belirgindir, ancak asenkron i\u015flemler veya Web Workers gibi durumlar yine de dikkat gerektirebilir.<\/li>\n<\/ol>\n<h3>Singleton Alternatifleri ve Ne Zaman Farkl\u0131 Bir Yakla\u015f\u0131m Tercih Edilmeli?<\/h3>\n<p>Singleton&#8217;\u0131n dezavantajlar\u0131 g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, genellikle daha iyi alternatifler oldu\u011fu durumlar vard\u0131r. \u0130\u015fte baz\u0131 alternatifler ve ne zaman farkl\u0131 bir yakla\u015f\u0131m tercih etmeniz gerekti\u011fi:<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection &#8211; DI)<\/h4>\n<p>DI, bir nesnenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 do\u011frudan olu\u015fturucudan veya bir metottan almas\u0131n\u0131 sa\u011flayan bir tekniktir. Singleton&#8217;\u0131n k\u00fcresel eri\u015fim sorununu \u00e7\u00f6zer ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 a\u00e7\u0131k hale getirir. Bu, kodun daha mod\u00fcler, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Logger s\u0131n\u0131f\u0131 (art\u0131k Singleton de\u011fil)\nclass Logger {\n    constructor(prefix = \"APP\") {\n        this.prefix = prefix;\n        this.logs = [];\n    }\n\n    log(message) {\n        const timestamp = new Date().toISOString();\n        this.logs.push(<code>[${this.prefix} - ${timestamp}] ${message}<\/code>);\n        console.log(<code>[${this.prefix} - LOG] ${message}<\/code>);\n    }\n}\n\n\/\/ Config s\u0131n\u0131f\u0131 (art\u0131k Singleton de\u011fil)\nclass Config {\n    constructor(settings) {\n        this.settings = settings;\n    }\n\n    getSetting(key) {\n        return this.settings[key];\n    }\n}\n\n\/\/ Mod\u00fcl veya servis, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 constructor'dan al\u0131r\nclass MyService {\n    constructor(logger, config) {\n        this.logger = logger;\n        this.config = config;\n    }\n\n    doWork() {\n        this.logger.log(\"Servis i\u015fini yap\u0131yor.\");\n        console.log(\"API URL:\", this.config.getSetting(\"apiUrl\"));\n    }\n}\n\n\/\/ Uygulama ba\u015flang\u0131c\u0131nda ba\u011f\u0131ml\u0131l\u0131klar\u0131 olu\u015ftur ve enjekte et\nconst appLogger = new Logger(\"MyApp\");\nconst appConfig = new Config({ apiUrl: \"https:\/\/newapi.example.com\" });\n\nconst myServiceInstance = new MyService(appLogger, appConfig);\nmyServiceInstance.doWork();\n\n\/\/ Farkl\u0131 bir test ortam\u0131 i\u00e7in farkl\u0131 ba\u011f\u0131ml\u0131l\u0131klar enjekte edilebilir\nconst testLogger = new Logger(\"TestApp\");\nconst testConfig = new Config({ apiUrl: \"http:\/\/localhost:8080\" });\nconst testServiceInstance = new MyService(testLogger, testConfig);\ntestServiceInstance.doWork(); \/\/ Farkl\u0131 log ve config kullan\u0131r\n<\/code><\/pre>\n<p>DI ile, <code>Logger<\/code> veya <code>Config<\/code> gibi servislerin birden fazla \u00f6rne\u011fi olu\u015fturulabilir ve farkl\u0131 ba\u011flamlarda farkl\u0131 davran\u0131\u015flar sergilemeleri sa\u011flanabilir. Bu, test edilebilirli\u011fi ve esnekli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h4>Fabrika Metodu (Factory Method) veya Soyut Fabrika (Abstract Factory)<\/h4>\n<p>Bu desenler, nesne olu\u015fturma mant\u0131\u011f\u0131n\u0131 soyutlamak i\u00e7in kullan\u0131l\u0131r. Bir Singleton&#8217;\u0131n aksine, bu desenler gerekti\u011finde birden fazla farkl\u0131 nesne t\u00fcr\u00fc olu\u015fturabilir ve hangi nesnenin olu\u015fturulaca\u011f\u0131na dair karar\u0131 merkezi bir yere ta\u015f\u0131r. Bu, esnekli\u011fi art\u0131r\u0131r ve yeni nesne t\u00fcrleri eklemeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Service Locator<\/h4>\n<p>Service Locator deseni, bir uygulaman\u0131n ihtiya\u00e7 duydu\u011fu servisleri bulmak i\u00e7in merkezi bir kay\u0131t defteri sa\u011flar. Bu, Singleton&#8217;a benzer \u015fekilde k\u00fcresel bir eri\u015fim noktas\u0131 sunar, ancak genellikle daha esnektir \u00e7\u00fcnk\u00fc hangi servisin d\u00f6nd\u00fcr\u00fclece\u011fi \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirilebilir (\u00f6rne\u011fin, mock servisleri i\u00e7in). Ancak Service Locator&#8217;\u0131n da Singleton gibi gizli ba\u011f\u0131ml\u0131l\u0131klar olu\u015fturma potansiyeli vard\u0131r.<\/p>\n<h4>Ne Zaman Singleton Kullan\u0131lmamal\u0131?<\/h4>\n<ul>\n<li>K\u00fcresel durumdan ka\u00e7\u0131nmak istedi\u011finizde.<\/li>\n<li>Test edilebilirli\u011fin \u00f6ncelikli oldu\u011fu durumlarda.<\/li>\n<li>Uygulaman\u0131n esnekli\u011finin ve gelecekteki de\u011fi\u015fikliklere uyum yetene\u011finin \u00f6nemli oldu\u011fu durumlarda.<\/li>\n<li>Bir nesnenin birden fazla \u00f6rne\u011fine ihtiya\u00e7 duyulma potansiyeli varsa.<\/li>\n<\/ul>\n<p>Modern JavaScript geli\u015ftirme ortamlar\u0131nda, \u00f6zellikle ES Mod\u00fclleri ile \u00e7al\u0131\u015f\u0131rken, bir\u00e7ok &#8220;Singleton&#8221; ihtiyac\u0131 do\u011fal olarak mod\u00fcl sistemi taraf\u0131ndan kar\u015f\u0131lan\u0131r. Bir mod\u00fcl\u00fcn d\u0131\u015fa aktard\u0131\u011f\u0131 bir nesne, o mod\u00fcl\u00fc i\u00e7e aktaran her yerde ayn\u0131 \u00f6rnek olacakt\u0131r. Bu, \u00e7o\u011fu zaman a\u00e7\u0131k\u00e7a bir Singleton deseni uygulamaktan daha temiz ve daha az sorunlu bir yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Singleton tasar\u0131m deseni, yaz\u0131l\u0131m geli\u015ftirmede belirli bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin olmas\u0131n\u0131 garanti etmek ve bu \u00f6rne\u011fe k\u00fcresel bir eri\u015fim noktas\u0131 sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. JavaScript&#8217;te ES5&#8217;teki kapan\u0131\u015flar ve IIFE&#8217;ler, ES6 s\u0131n\u0131flar\u0131 ve \u00f6zellikle modern mod\u00fcl sistemleri arac\u0131l\u0131\u011f\u0131yla \u00e7e\u015fitli \u015fekillerde uygulanabilir.<\/p>\n<p>Konfig\u00fcrasyon y\u00f6neticileri, loglama servisleri ve olay yay\u0131c\u0131lar gibi belirli senaryolarda Singleton&#8217;lar kaynak y\u00f6netimini ve uygulama genelinde tutarl\u0131l\u0131\u011f\u0131 sa\u011flayarak \u00f6nemli avantajlar sunabilir. Ancak, Singleton&#8217;\u0131n beraberinde getirdi\u011fi k\u00fcresel durum sorunlar\u0131, test edilebilirli\u011fi d\u00fc\u015f\u00fcrmesi ve esneklik eksikli\u011fi gibi \u00f6nemli dezavantajlar\u0131 da g\u00f6z ard\u0131 etmemek gerekir.<\/p>\n<p>Modern JavaScript geli\u015ftirme pratiklerinde, ES Mod\u00fclleri&#8217;nin do\u011fas\u0131 gere\u011fi zaten Singleton benzeri davran\u0131\u015flar sergilemesi, bir\u00e7ok durumda a\u00e7\u0131k\u00e7a bir Singleton deseni uygulamaya gerek kalmadan benzer faydalar sa\u011flar. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi alternatifler ise, Singleton&#8217;\u0131n dezavantajlar\u0131n\u0131 a\u015farak daha mod\u00fcler, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir kod yazma imkan\u0131 sunar.<\/p>\n<p>\u00d6zetle, Singleton deseni g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r ancak dikkatli ve bilin\u00e7li kullan\u0131lmal\u0131d\u0131r. Potansiyel dezavantajlar\u0131n\u0131 anlayarak ve alternatifleri g\u00f6z \u00f6n\u00fcnde bulundurarak, projenizin ihtiya\u00e7lar\u0131na en uygun tasar\u0131m\u0131 se\u00e7meniz kritik \u00f6neme sahiptir. Amac\u0131m\u0131z her zaman, okunabilir, s\u00fcrd\u00fcr\u00fclebilir ve esnek bir kod taban\u0131 olu\u015fturmakt\u0131r; Singleton bu amaca hizmet etti\u011finde de\u011ferli, aksi takdirde ka\u00e7\u0131n\u0131lmas\u0131 gereken bir desendir.<\/p>\n<p><\/body><br \/>\n<\/HTML><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber\nYaz\u0131l\u0131m geli\u015ftirmede, belirli bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011fin","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-39541","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript&#039;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript&#039;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"JavaScript&#039;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber Yaz\u0131l\u0131m geli\u015ftirmede, belirli bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011fin\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-23T15:40:45+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-02-23T15:40:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\"},\"wordCount\":2281,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\",\"name\":\"JavaScript'te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-23T15:40:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript'te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript'te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber","og_description":"JavaScript'te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber Yaz\u0131l\u0131m geli\u015ftirmede, belirli bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011fin","og_url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-23T15:40:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber","datePublished":"2026-02-23T15:40:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/"},"wordCount":2281,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/","name":"JavaScript'te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-23T15:40:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-singleton-tasarim-deseni-ile-calismak-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript&#8217;te Singleton Tasar\u0131m Deseni ile \u00c7al\u0131\u015fmak: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=39541"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39541\/revisions"}],"predecessor-version":[{"id":39542,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39541\/revisions\/39542"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}