{"id":39240,"date":"2026-02-17T11:41:27","date_gmt":"2026-02-17T08:41:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39240"},"modified":"2026-02-17T11:41:27","modified_gmt":"2026-02-17T08:41:27","slug":"singleton-tasarim-deseni-nedir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/","title":{"rendered":"Singleton Tasar\u0131m Deseni Nedir?"},"content":{"rendered":"<p><body><\/p>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak problemleri \u00e7\u00f6zmek i\u00e7in kan\u0131tlanm\u0131\u015f, tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan tasar\u0131m desenleri, mimari bir yol haritas\u0131 g\u00f6revi g\u00f6r\u00fcr. Bu desenler, kodun okunabilirli\u011fini, s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve geni\u015fletilebilirli\u011fini art\u0131r\u0131r. Tasar\u0131m desenleri aras\u0131nda en temel ve s\u0131kl\u0131kla yanl\u0131\u015f anla\u015f\u0131lanlardan biri de Singleton (Tekil Nesne) desenidir. Bu rehberde, Singleton tasar\u0131m desenini JavaScript \u00f6zelinde detayl\u0131 bir \u015fekilde inceleyecek, nas\u0131l uygulanaca\u011f\u0131n\u0131 g\u00f6sterecek, ne zaman kullan\u0131lmas\u0131 gerekti\u011fini tart\u0131\u015facak ve potansiyel tuzaklara de\u011finece\u011fiz.<\/p>\n<h2>Singleton Tasar\u0131m Deseni Nedir?<\/h2>\n<p>Singleton tasar\u0131m deseni, bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin (instance) olmas\u0131n\u0131 ve bu tek \u00f6rne\u011fe global bir eri\u015fim noktas\u0131 sa\u011flamas\u0131n\u0131 garanti eden yarat\u0131msal (creational) bir desendir. Temel amac\u0131, bir uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca belirli bir kayna\u011f\u0131n veya hizmetin sadece bir kez ba\u015flat\u0131lmas\u0131n\u0131 ve t\u00fcm bile\u015fenler taraf\u0131ndan payla\u015f\u0131lmas\u0131n\u0131 sa\u011flamakt\u0131r. Bu, \u00f6zellikle kaynak yo\u011fun nesnelerin (\u00f6rne\u011fin, veritaban\u0131 ba\u011flant\u0131lar\u0131, konfig\u00fcrasyon y\u00f6neticileri veya loglama servisleri) performans ve tutarl\u0131l\u0131k a\u00e7\u0131s\u0131ndan tek bir noktadan y\u00f6netilmesini gerektiren senaryolarda kritik \u00f6neme sahiptir.<\/p>\n<p>Singleton&#8217;\u0131n temel prensipleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Tek \u00d6rnek Garantisi:<\/strong> S\u0131n\u0131f\u0131n birden fazla \u00f6rne\u011finin olu\u015fturulmas\u0131n\u0131 engeller.<\/li>\n<li><strong>Global Eri\u015fim Noktas\u0131:<\/strong> Olu\u015fturulan tek \u00f6rne\u011fe her yerden eri\u015fim imkan\u0131 sunar.<\/li>\n<\/ul>\n<p>JavaScript, s\u0131n\u0131f tabanl\u0131 bir dil olmasa da (prototip tabanl\u0131d\u0131r), ES6 ile birlikte gelen <code>class<\/code> anahtar kelimesi ve fonksiyonel programlama yetenekleri sayesinde Singleton desenini \u00e7e\u015fitli yollarla uygulamak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>JavaScript&#8217;te Singleton Uygulamalar\u0131<\/h2>\n<p>JavaScript&#8217;te Singleton deseni i\u00e7in birden fazla uygulama yakla\u015f\u0131m\u0131 bulunmaktad\u0131r. Her bir yakla\u015f\u0131m, dilin farkl\u0131 \u00f6zelliklerinden yararlan\u0131r ve farkl\u0131 senaryolar i\u00e7in uygun olabilir.<\/p>\n<h3>Klasik Yakla\u015f\u0131m (Kurucu Fonksiyon ile)<\/h3>\n<p>Bu yakla\u015f\u0131m, Singleton&#8217;\u0131 bir kurucu fonksiyon ve bir closure (kapan\u0131m) kullanarak olu\u015fturur. Closure, tekil \u00f6rne\u011fi depolamak i\u00e7in kullan\u0131l\u0131r ve bu \u00f6rnek, d\u0131\u015far\u0131dan do\u011frudan eri\u015filemeyen \u00f6zel bir de\u011fi\u015fken i\u00e7inde saklan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\nfunction Logger() {\n    \/\/ \u00d6rnek zaten var m\u0131 kontrol et\n    if (Logger.instance) {\n        return Logger.instance;\n    }\n\n    \/\/ Yeni bir \u00f6rnek olu\u015ftur\n    this.logs = [];\n    Logger.instance = this; \/\/ Yeni \u00f6rne\u011fi kaydet\n\n    console.log(\"Logger \u00f6rne\u011fi olu\u015fturuldu.\");\n\n    \/\/ Public metodlar\n    this.log = function(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    this.getLogs = function() {\n        return this.logs;\n    };\n}\n\n\/\/ Kullan\u0131m\nconst logger1 = new Logger();\nconst logger2 = new Logger();\n\nconsole.log(logger1 === logger2); \/\/ true - Ayn\u0131 \u00f6rnek\n\nlogger1.log(\"Uygulama ba\u015flat\u0131ld\u0131.\");\nlogger2.log(\"Kullan\u0131c\u0131 giri\u015fi denemesi.\");\n\nconsole.log(logger1.getLogs());\nconsole.log(logger2.getLogs()); \/\/ Her iki loglay\u0131c\u0131 da ayn\u0131 loglar\u0131 i\u00e7erir.\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Logger<\/code> kurucu fonksiyonu her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, <code>Logger.instance<\/code> statik \u00f6zelli\u011fini kontrol eder. E\u011fer bir \u00f6rnek zaten varsa, mevcut \u00f6rne\u011fi d\u00f6nd\u00fcr\u00fcr. Aksi takdirde, yeni bir \u00f6rnek olu\u015fturur ve <code>Logger.instance<\/code>&#8216;a atar. Bu sayede, her zaman ayn\u0131 <code>Logger<\/code> \u00f6rne\u011fine sahip olunur.<\/p>\n<h3>ES6 S\u0131n\u0131flar\u0131 ile Yakla\u015f\u0131m<\/h3>\n<p>ES6 ile gelen <code>class<\/code> anahtar kelimesi, daha geleneksel bir s\u0131n\u0131f tan\u0131m\u0131 yap\u0131s\u0131 sunar. Singleton, bu yap\u0131da statik metotlar ve \u00f6zellikler kullan\u0131larak uygulanabilir.<\/p>\n<pre><code class=\"language-javascript\">\nclass ConfigManager {\n    constructor() {\n        if (ConfigManager.instance) {\n            return ConfigManager.instance;\n        }\n\n        this.settings = {\n            apiBaseUrl: \"https:\/\/api.example.com\",\n            timeout: 5000,\n            debugMode: false\n        };\n        ConfigManager.instance = this;\n        console.log(\"ConfigManager \u00f6rne\u011fi olu\u015fturuldu.\");\n    }\n\n    getSetting(key) {\n        return this.settings[key];\n    }\n\n    setSetting(key, value) {\n        this.settings[key] = value;\n        console.log(<code>Ayarlar g\u00fcncellendi: ${key} = ${value}<\/code>);\n    }\n\n    static getInstance() {\n        if (!ConfigManager.instance) {\n            ConfigManager.instance = new ConfigManager();\n        }\n        return ConfigManager.instance;\n    }\n}\n\n\/\/ Kullan\u0131m\nconst config1 = ConfigManager.getInstance();\nconst config2 = ConfigManager.getInstance();\n\nconsole.log(config1 === config2); \/\/ true - Ayn\u0131 \u00f6rnek\n\nconsole.log(config1.getSetting(\"apiBaseUrl\"));\nconfig2.setSetting(\"debugMode\", true);\nconsole.log(config1.getSetting(\"debugMode\")); \/\/ true\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131mda, s\u0131n\u0131f\u0131n kurucusu do\u011frudan \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda (<code>new ConfigManager()<\/code>), yine bir Singleton davran\u0131\u015f\u0131 sergiler. Ancak, yayg\u0131n kullan\u0131m \u015fekli <code>static getInstance()<\/code> metodunu kullanmakt\u0131r. Bu metot, \u00f6rne\u011fi tembelce (lazy) ba\u015flat\u0131r; yani, sadece ilk ihtiya\u00e7 duyuldu\u011funda olu\u015fturur.<\/p>\n<h3>Mod\u00fcl Yakla\u015f\u0131m\u0131 (En Yayg\u0131n ve \u0130deal)<\/h3>\n<p>Modern JavaScript&#8217;te (\u00f6zellikle ES Mod\u00fclleri ile), Singleton desenini uygulaman\u0131n en do\u011fal ve yayg\u0131n yolu mod\u00fcl deseni kullanmakt\u0131r. JavaScript mod\u00fclleri, do\u011fas\u0131 gere\u011fi Singleton davran\u0131\u015f\u0131n\u0131 destekler. Bir mod\u00fcl bir kez i\u00e7e aktar\u0131ld\u0131\u011f\u0131nda (imported), kodu sadece bir kez y\u00fcr\u00fct\u00fcl\u00fcr ve mod\u00fcl\u00fcn d\u0131\u015fa aktard\u0131\u011f\u0131 nesneler (export edilenler) uygulaman\u0131n her yerinde ayn\u0131 \u00f6rne\u011fi temsil eder.<\/p>\n<p><strong><code>cacheService.js<\/code><\/strong><\/p>\n<pre><code class=\"language-javascript\">\n\/\/ cacheService.js\nconst cache = {};\n\nconst CacheService = {\n    get(key) {\n        console.log(<code>Cache'ten okunuyor: ${key}<\/code>);\n        return cache[key];\n    },\n    set(key, value) {\n        console.log(<code>Cache'e yaz\u0131l\u0131yor: ${key}<\/code>);\n        cache[key] = value;\n    },\n    clear(key) {\n        console.log(<code>Cache temizleniyor: ${key}<\/code>);\n        delete cache[key];\n    },\n    getAll() {\n        return { ...cache }; \/\/ \u00d6nbelle\u011fin bir kopyas\u0131n\u0131 d\u00f6nd\u00fcr\n    }\n};\n\nexport default CacheService; \/\/ Mod\u00fcl\u00fc d\u0131\u015fa aktar\n<\/code><\/pre>\n<p><strong><code>app.js<\/code><\/strong><\/p>\n<pre><code class=\"language-javascript\">\n\/\/ app.js\nimport CacheService from '.\/cacheService.js';\nimport { someFunctionInAnotherModule } from '.\/anotherModule.js';\n\nCacheService.set(\"userData\", { id: 1, name: \"Alice\" });\n\n\/\/ Ba\u015fka bir yerden \u00e7a\u011fr\u0131\nsomeFunctionInAnotherModule();\n\nconst data = CacheService.get(\"userData\");\nconsole.log(\"Uygulamadan okunan data:\", data);\n<\/code><\/pre>\n<p><strong><code>anotherModule.js<\/code><\/strong><\/p>\n<pre><code class=\"language-javascript\">\n\/\/ anotherModule.js\nimport CacheService from '.\/cacheService.js';\n\nexport function someFunctionInAnotherModule() {\n    const config = CacheService.get(\"appConfig\");\n    if (!config) {\n        CacheService.set(\"appConfig\", { theme: \"dark\", lang: \"tr\" });\n    }\n    console.log(\"Ba\u015fka bir mod\u00fclden cache kontrol\u00fc yap\u0131ld\u0131.\");\n}\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131mda, <code>CacheService<\/code> nesnesi yaln\u0131zca bir kez olu\u015fturulur ve <code>export default<\/code> ile d\u0131\u015fa aktar\u0131l\u0131r. Uygulaman\u0131n herhangi bir yerinden <code>import CacheService from '.\/cacheService.js';<\/code> ile i\u00e7e aktar\u0131ld\u0131\u011f\u0131nda, her zaman ayn\u0131 nesneye referans edilir. Bu, modern JavaScript uygulamalar\u0131nda Singleton davran\u0131\u015f\u0131n\u0131 sa\u011flaman\u0131n en temiz ve en \u00e7ok tercih edilen yoludur.<\/p>\n<h2>Singleton Ne Zaman Kullan\u0131lmal\u0131?<\/h2>\n<p>Singleton deseni, belirli senaryolarda olduk\u00e7a faydal\u0131 olabilir:<\/p>\n<ul>\n<li>\n<h3>Veritaban\u0131 Ba\u011flant\u0131lar\u0131 veya Havuzlar\u0131<\/h3>\n<p>Bir uygulaman\u0131n tek bir veritaban\u0131 ba\u011flant\u0131 havuzuna sahip olmas\u0131 performans\u0131 art\u0131r\u0131r ve kaynaklar\u0131 daha verimli kullan\u0131r. Her istek i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7mak yerine, mevcut havuzdan bir ba\u011flant\u0131 al\u0131n\u0131r.<\/p>\n<\/li>\n<li>\n<h3>Loglama Servisleri<\/h3>\n<p>T\u00fcm uygulaman\u0131n olaylar\u0131 tek bir merkezi loglay\u0131c\u0131ya g\u00f6ndermesi gerekti\u011finde Singleton idealdir. Bu sayede t\u00fcm loglar tutarl\u0131 bir formatta toplan\u0131r ve y\u00f6netilir.<\/p>\n<\/li>\n<li>\n<h3>Konfig\u00fcrasyon Y\u00f6neticileri<\/h3>\n<p>Uygulama genelindeki ayarlar\u0131n (API anahtarlar\u0131, ortam de\u011fi\u015fkenleri vb.) tek bir yerden okunmas\u0131 ve g\u00fcncellenmesi gerekti\u011finde Singleton kullan\u0131l\u0131r. Bu, ayarlar\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<\/li>\n<li>\n<h3>\u00d6nbellekleme Servisleri<\/h3>\n<p>Uygulama i\u00e7inde s\u0131k\u00e7a eri\u015filen verileri saklamak i\u00e7in tek bir \u00f6nbellek \u00f6rne\u011fi kullanmak performans\u0131 art\u0131r\u0131r ve bellek y\u00f6netimini kolayla\u015ft\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n<h3>Merkezi State Y\u00f6netimi<\/h3>\n<p>Redux store gibi merkezi durum y\u00f6neticileri, asl\u0131nda birer Singleton olarak hareket eder. T\u00fcm uygulama state&#8217;i tek bir yerde tutulur ve g\u00fcncellenir.<\/p>\n<\/li>\n<li>\n<h3>Cihaz S\u00fcr\u00fcc\u00fcleri<\/h3>\n<p>Fiziksel bir cihaza (\u00f6rne\u011fin, bir yaz\u0131c\u0131) eri\u015fim sa\u011flayan bir s\u00fcr\u00fcc\u00fc, genellikle tek bir \u00f6rne\u011fe sahip olmal\u0131d\u0131r.<\/p>\n<\/li>\n<\/ul>\n<h2>Singleton&#8217;\u0131n Avantajlar\u0131 ve Dezavantajlar\u0131<\/h2>\n<p>Her tasar\u0131m deseni gibi, Singleton&#8217;\u0131n da kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r. Bunlar\u0131 bilmek, deseni do\u011fru senaryolarda kullanmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Avantajlar\u0131<\/h3>\n<ul>\n<li>\n        <strong>Tek \u00d6rnek Garantisi:<\/strong> Bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin oldu\u011fundan emin olman\u0131n tek yoludur. Bu, kaynak y\u00f6netiminde ve tutarl\u0131l\u0131kta b\u00fcy\u00fck fayda sa\u011flar.\n    <\/li>\n<li>\n        <strong>Global Eri\u015fim Noktas\u0131:<\/strong> \u0130htiya\u00e7 duyulan her yerden kolayca eri\u015filebilir. Karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k enjeksiyon sistemlerine gerek kalmadan kaynaklara eri\u015fim sa\u011flar.\n    <\/li>\n<li>\n        <strong>Kaynak T\u00fcketimini Azalt\u0131r:<\/strong> \u00d6zellikle a\u011f\u0131r nesnelerin (veritaban\u0131 ba\u011flant\u0131lar\u0131, dosya sistemleri) birden \u00e7ok kez olu\u015fturulmas\u0131n\u0131 engelleyerek sistem kaynaklar\u0131n\u0131 korur.\n    <\/li>\n<li>\n        <strong>Merkezi Kontrol:<\/strong> Belirli bir kayna\u011f\u0131n veya hizmetin ya\u015fam d\u00f6ng\u00fcs\u00fc ve durumu tek bir nokta \u00fczerinden y\u00f6netilir.\n    <\/li>\n<\/ul>\n<h3>Dezavantajlar\u0131<\/h3>\n<ul>\n<li>\n        <strong>Global Durum Yarat\u0131r:<\/strong> Singleton&#8217;lar global durum olu\u015fturur ve bu durum uygulaman\u0131n her yerinden de\u011fi\u015ftirilebilir. Bu, \u00f6zellikle b\u00fcy\u00fck uygulamalarda beklenmedik yan etkilere ve hatalara yol a\u00e7abilir.\n    <\/li>\n<li>\n        <strong>Test Edilebilirli\u011fi Zorla\u015ft\u0131r\u0131r:<\/strong> Birim testleri yazarken, Singleton&#8217;a ba\u011f\u0131ml\u0131 bile\u015fenleri izole etmek zordur. Singleton&#8217;\u0131n global durumu, testler aras\u0131nda birikerek testlerin deterministik olmamas\u0131na neden olabilir. Mock&#8217;lama veya sahte nesneler kullanmak karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>S\u0131k\u0131 Ba\u011f\u0131ml\u0131l\u0131klar (Tight Coupling):<\/strong> Singleton&#8217;\u0131 kullanan s\u0131n\u0131flar, do\u011frudan Singleton s\u0131n\u0131f\u0131na ba\u011f\u0131ml\u0131 hale gelir. Bu, kodun yeniden kullan\u0131labilirli\u011fini azalt\u0131r ve mimariyi kat\u0131la\u015ft\u0131r\u0131r. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection) gibi desenlerle \u00e7eli\u015fir.\n    <\/li>\n<li>\n        <strong>Sorumluluklar\u0131n Ayr\u0131m\u0131 Prensibini \u0130hlal Edebilir:<\/strong> Bir s\u0131n\u0131f\u0131n kendi \u00f6rne\u011fini y\u00f6netme ve ayn\u0131 zamanda i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fctme sorumlulu\u011funu ta\u015f\u0131mas\u0131, Tek Sorumluluk Prensibi&#8217;ne (Single Responsibility Principle) ayk\u0131r\u0131 olabilir.\n    <\/li>\n<li>\n        <strong>Gizli Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> Bir fonksiyon veya s\u0131n\u0131f\u0131n bir Singleton kulland\u0131\u011f\u0131, imzas\u0131ndan (parametresinden) belli olmayabilir. Bu da kodun anla\u015f\u0131lmas\u0131n\u0131 ve hata ay\u0131klamas\u0131n\u0131 zorla\u015ft\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>\u00c7oklu \u0130\u015f Par\u00e7ac\u0131\u011f\u0131 Sorunlar\u0131 (JavaScript i\u00e7in daha az):<\/strong> Geleneksel olarak, Singleton deseninin \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 ortamlar\u0131nda (multi-threaded environments) dikkatli bir \u015fekilde uygulanmas\u0131 gerekir (thread-safe). JavaScript tek i\u015f par\u00e7ac\u0131kl\u0131 oldu\u011fundan bu sorun daha az belirgin olsa da, Web Workers gibi durumlar veya asenkron i\u015flemler s\u0131ras\u0131nda yine de dikkatli olunmal\u0131d\u0131r.\n    <\/li>\n<\/ul>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Singleton tasar\u0131m deseni, bir s\u0131n\u0131f\u0131n yaln\u0131zca bir \u00f6rne\u011finin olmas\u0131n\u0131 ve bu \u00f6rne\u011fe global bir eri\u015fim noktas\u0131 sa\u011flamas\u0131n\u0131 garanti eden g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. JavaScript&#8217;te, \u00f6zellikle ES6 mod\u00fclleri arac\u0131l\u0131\u011f\u0131yla, bu davran\u0131\u015fa do\u011fal yollardan ula\u015fmak m\u00fcmk\u00fcnd\u00fcr. Ancak, global durum olu\u015fturma, test edilebilirli\u011fi zorla\u015ft\u0131rma ve s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131klar yaratma gibi potansiyel dezavantajlar\u0131 nedeniyle dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<p>Modern JavaScript geli\u015ftirme pratiklerinde, mod\u00fcllerin sundu\u011fu do\u011fal Singleton benzeri davran\u0131\u015f ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu gibi yakla\u015f\u0131mlar, bir\u00e7ok durumda Singleton deseninin manuel olarak uygulanmas\u0131na olan ihtiyac\u0131 azaltm\u0131\u015ft\u0131r. Yine de, veritaban\u0131 ba\u011flant\u0131lar\u0131, loglama servisleri veya konfig\u00fcrasyon y\u00f6neticileri gibi belirli senaryolarda Singleton hala ge\u00e7erli ve etkili bir \u00e7\u00f6z\u00fcm olabilir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h3>Singleton bir anti-pattern midir?<\/h3>\n<p>Singleton, baz\u0131 geli\u015ftiriciler taraf\u0131ndan bir anti-pattern olarak g\u00f6r\u00fcl\u00fcr \u00e7\u00fcnk\u00fc global durum yarat\u0131r, test edilebilirli\u011fi zorla\u015ft\u0131r\u0131r ve s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131klara yol a\u00e7abilir. Ancak, do\u011fru senaryolarda (\u00f6rne\u011fin, tek bir veritaban\u0131 ba\u011flant\u0131 havuzu veya loglay\u0131c\u0131 gibi kaynak y\u00f6netimi) hala de\u011ferli bir desendir. \u00d6nemli olan, potansiyel dezavantajlar\u0131n\u0131 anlamak ve bilin\u00e7li bir karar vermektir.<\/p>\n<h3>Singleton ve Mod\u00fcl Deseni aras\u0131ndaki fark nedir?<\/h3>\n<p>Mod\u00fcl deseni (\u00f6zellikle ES Mod\u00fclleri), JavaScript&#8217;te do\u011fal olarak Singleton benzeri bir davran\u0131\u015f sa\u011flar. Bir ES mod\u00fcl\u00fc bir kez y\u00fcklendi\u011finde, i\u00e7indeki t\u00fcm d\u0131\u015fa aktar\u0131lan de\u011ferler (fonksiyonlar, nesneler vb.) uygulaman\u0131n her yerinde ayn\u0131 \u00f6rne\u011fi temsil eder. Singleton deseni ise daha \u00e7ok &#8220;bir s\u0131n\u0131f\u0131n tek bir \u00f6rne\u011fini garanti etme&#8221; kavram\u0131na odaklan\u0131rken, mod\u00fcl deseni daha geni\u015f bir kapsama sahiptir ve kod organizasyonu ile bilgi gizleme (encapsulation) i\u00e7in kullan\u0131l\u0131r. Modern JS&#8217;de, \u00e7o\u011fu zaman bir mod\u00fcl\u00fc d\u0131\u015fa aktararak Singleton davran\u0131\u015f\u0131 elde etmek en temiz yoldur.<\/p>\n<h3>JavaScript&#8217;te Singleton&#8217;\u0131 test etmek zor mudur?<\/h3>\n<p>Evet, Singleton&#8217;\u0131 test etmek zor olabilir \u00e7\u00fcnk\u00fc global durum yarat\u0131r ve testler aras\u0131nda etkile\u015fime neden olabilir. Birim testlerinde, her testin izole olmas\u0131 ve birbirinden etkilenmemesi istenir. Singleton&#8217;\u0131n global durumu bu prensibi bozabilir. Bu durumu a\u015fmak i\u00e7in mock&#8217;lama k\u00fct\u00fcphaneleri kullan\u0131labilir veya Singleton&#8217;\u0131n test ortam\u0131nda yeniden ba\u015flat\u0131labilir bir mekanizmas\u0131 tasarlanabilir. Ancak, mod\u00fcl deseni ile uygulanan Singleton&#8217;lar, mod\u00fcllerin import\/export mekanizmas\u0131 sayesinde daha kolay mock&#8217;lanabilir olabilir.<\/p>\n<h3>ES6 mod\u00fclleri Singleton davran\u0131\u015f\u0131n\u0131 nas\u0131l sa\u011flar?<\/h3>\n<p>ES6 mod\u00fclleri, her mod\u00fcl\u00fcn sadece bir kez de\u011ferlendirilmesini (parse edilmesini ve \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131) garanti eder. Bir mod\u00fcl\u00fcn d\u0131\u015fa aktard\u0131\u011f\u0131 herhangi bir \u015fey (bir nesne, bir fonksiyon vb.), o mod\u00fcl\u00fcn ilk y\u00fcklendi\u011fi anda olu\u015fturulur ve daha sonra bu mod\u00fcl\u00fc i\u00e7e aktaran her yer ayn\u0131 referansa sahip olur. Bu, herhangi bir ek kod yazmaya gerek kalmadan do\u011fal bir Singleton davran\u0131\u015f\u0131 sa\u011flar.<\/p>\n<h3>Bir Singleton&#8217;\u0131 ne zaman kullanmaktan ka\u00e7\u0131nmal\u0131y\u0131m?<\/h3>\n<p>Singleton&#8217;dan ka\u00e7\u0131nman\u0131z gereken durumlar \u015funlard\u0131r: e\u011fer nesnenin birden fazla \u00f6rne\u011fine ihtiya\u00e7 duyulabilecekse, global durumun y\u00f6netimi karma\u015f\u0131kl\u0131\u011fa yol a\u00e7acaksa, test edilebilirli\u011fin \u00f6ncelikli oldu\u011fu durumlarda ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi daha esnek mimari desenler kullan\u0131l\u0131yorsa. Genellikle, bir nesnenin tekil olmas\u0131n\u0131n mimari bir gereklilikten ziyade sadece bir kolayl\u0131k oldu\u011fu durumlarda Singleton&#8217;dan ka\u00e7\u0131n\u0131lmal\u0131d\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak problemleri \u00e7\u00f6zmek i\u00e7in kan\u0131tlanm\u0131\u015f, tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan tasar","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":[1],"tags":[],"class_list":{"0":"post-39240","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Singleton Tasar\u0131m Deseni Nedir? - 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\/singleton-tasarim-deseni-nedir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Singleton Tasar\u0131m Deseni Nedir?\" \/>\n<meta property=\"og:description\" content=\"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak problemleri \u00e7\u00f6zmek i\u00e7in kan\u0131tlanm\u0131\u015f, tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan tasar\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-17T08:41:27+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=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Singleton Tasar\u0131m Deseni Nedir?\",\"datePublished\":\"2026-02-17T08:41:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/\"},\"wordCount\":1874,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/\",\"name\":\"Singleton Tasar\u0131m Deseni Nedir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-17T08:41:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Singleton Tasar\u0131m Deseni Nedir?\"}]},{\"@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":"Singleton Tasar\u0131m Deseni Nedir? - 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\/singleton-tasarim-deseni-nedir\/","og_locale":"tr_TR","og_type":"article","og_title":"Singleton Tasar\u0131m Deseni Nedir?","og_description":"Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kar\u015f\u0131la\u015f\u0131lan ortak problemleri \u00e7\u00f6zmek i\u00e7in kan\u0131tlanm\u0131\u015f, tekrar kullan\u0131labilir \u00e7\u00f6z\u00fcmler sunan tasar","og_url":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-17T08:41:27+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Singleton Tasar\u0131m Deseni Nedir?","datePublished":"2026-02-17T08:41:27+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/"},"wordCount":1874,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/","url":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/","name":"Singleton Tasar\u0131m Deseni Nedir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-17T08:41:27+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/singleton-tasarim-deseni-nedir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Singleton Tasar\u0131m Deseni Nedir?"}]},{"@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\/39240","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=39240"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39240\/revisions"}],"predecessor-version":[{"id":39241,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39240\/revisions\/39241"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}