[{"data":1,"prerenderedAt":1294},["ShallowReactive",2],{"post-\u002Ftr\u002Fsingleton-tasarim-deseni-nedir":3},{"page":4,"translation":1138,"nav":1152,"related":1274,"random":1284},{"id":5,"title":6,"body":7,"categories":1136,"category":1138,"date":1139,"description":1140,"draft":1141,"extension":1142,"image":1143,"kind":1138,"lang":360,"meta":1144,"navigation":202,"path":1027,"readingTime":212,"seo":1145,"slug":1146,"stem":1147,"tags":1148,"translationKey":1138,"type":1137,"updated":1138,"__hash__":1151},"postsTr\u002Ftr\u002Fsingleton-tasarim-deseni-nedir.md","Singleton Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1112},"minimark",[10,20,33,36,77,80,85,91,93,97,100,105,108,111,118,122,125,128,130,134,137,160,162,166,169,347,349,353,415,417,421,427,434,528,530,534,548,550,554,586,588,592,596,822,826,932,934,938,942,966,970,977,988,998,1000,1004,1009,1028,1033,1061,1066,1108],[11,12,13,14,19],"p",{},"Bu yazı ",[15,16,18],"a",{"href":17},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns\u002FTasarım Desenleri Nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[11,21,22,23,32],{},"Bu içerik ağırlıklı olarak ",[15,24,31],{"href":25,"rel":26,"target":30},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[27,28,29],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur.",[11,34,35],{},"Tüm tasarım desenleri ya da diğer adıyla tasarım kalıplarına yönelik ayrıntılı içeriklere yazının sonundaki bağlantılardan ulaşabilirsiniz.",[37,38,39,46],"blockquote",{},[11,40,41,42],{},"💡 ",[43,44,45],"strong",{},"Özet (TL;DR):",[47,48,49,56,67],"ul",{},[50,51,52,55],"li",{},[43,53,54],{},"Amaç:"," Bir sınıfın yalnızca tek bir örneğinin (instance) var olmasını garanti eder ve bu örneğe global bir erişim noktası sağlar.",[50,57,58,61,62,66],{},[43,59,60],{},"Kilit Yapılar:"," Private constructor (dışarıdan nesne oluşturulmasını engeller) ve statik ",[63,64,65],"code",{},"getInstance()"," metodu.",[50,68,69,72,73,76],{},[43,70,71],{},"Eleştiri:"," Birçok modern mimaride test edilebilirliği zorlaştırması ve sıkı bağımlılık (tight coupling) yaratması sebebiyle bir ",[43,74,75],{},"anti-pattern"," olarak kabul edilmektedir. Modern projelerde alternatifi olarak Dependency Injection (DI) Container'lar kullanılır.",[78,79],"hr",{},[81,82,84],"h2",{"id":83},"singleton-deseninin-amacı","Singleton Deseninin Amacı",[11,86,87,90],{},[43,88,89],{},"Singleton"," (Tekil), bir nesnenin sadece tek bir örneğinin olduğundan emin olmak ve bu nesneye ihtiyaç duyduğunuzda kodunuzun her yerinden aynı örneğin çağrılmasını sağlamak için kullanılan yaratımsal (creational) bir tasarım desenidir.",[78,92],{},[81,94,96],{"id":95},"sorun","Sorun",[11,98,99],{},"Singleton deseni, SOLID programlama prensiplerinin en başında gelen \"Tek Sorumluluk Prensibi\"ne (Single Responsibility Principle) aykırılık oluşturma pahasına iki problemi tek seferde çözer:",[101,102,104],"h3",{"id":103},"_1-bir-sınıfın-tek-bir-örneğinin-olduğundan-emin-olmak","1. Bir sınıfın tek bir örneğinin olduğundan emin olmak",[11,106,107],{},"Neden bir sınıfa ait sadece tek bir örneğin olması istenir? En sık karşılaşılan sebep; paylaşılan ortak bir kaynağa (örneğin bir veritabanı bağlantısı, bir dosya veya log sistemi) erişimi tek elden kontrol etmektir.",[11,109,110],{},"Normal bir oluşturucu (constructor) çağrısı her zaman yeni bir nesne döndürmek zorundadır. Ancak Singleton tasarımında, daha önce bir nesne oluşturulduysa tekrar yeni bir nesne oluşturulmaz, hafızadaki mevcut örnek istemciye geri dönüştürülür.",[11,112,113],{},[114,115],"img",{"alt":116,"src":117},"","\u002Fimages\u002Fsingleton-tasarim-deseni-nedir\u002Fsingleton-comic-1-1.avif",[101,119,121],{"id":120},"_2-o-örneğe-global-bir-erişim-noktası-sağlamak","2. O örneğe global bir erişim noktası sağlamak",[11,123,124],{},"Uygulamalarda önemli nesneleri saklamak için kullanılan global değişkenler her zaman risk taşır. Herhangi bir kod parçası bu global değişkenlerin üzerine yazıp uygulamanın çökmesine neden olabilir.",[11,126,127],{},"Singleton deseni, nesneye tıpkı global bir değişken gibi her yerden erişmenizi sağlar ancak diğer kodların bu örneğin üzerine yazmasını (overwrite) engelleyerek güvenli bir koruma sunar.",[78,129],{},[81,131,133],{"id":132},"çözüm","Çözüm",[11,135,136],{},"Tüm Singleton uygulamalarında şu iki adım ortaktır:",[47,138,139,154],{},[50,140,141,142,145,146,149,150,153],{},"Sınıfın varsayılan yapılandırıcısını (",[63,143,144],{},"constructor",") ",[43,147,148],{},"private"," (veya protected) yapın. Böylece diğer sınıflar ",[63,151,152],{},"new"," operatörünü kullanarak bu sınıftan nesne üretemez.",[50,155,156,157,159],{},"Constructor görevi görecek statik bir oluşturma metodu (genellikle ",[63,158,65],{},") yazın. Bu metot arka planda private constructor'ı çağırıp oluşturulan nesneyi statik bir değişkende saklar. Sonraki çağrılarda ise her zaman bu saklanan nesneyi geri döndürür.",[78,161],{},[81,163,165],{"id":164},"gerçek-hayat-senaryosu-veritabanı-bağlantı-yöneticisi","Gerçek Hayat Senaryosu: Veritabanı Bağlantı Yöneticisi",[11,167,168],{},"Loglama veya DB bağlantısı gibi ortak kaynakların yönetiminde PHP üzerinde Singleton şu şekilde kurgulanır:",[170,171,175],"pre",{"className":172,"code":173,"language":174,"meta":116,"style":116},"language-php shiki shiki-themes github-light github-dark","class DatabaseConnection {\n    private static ?DatabaseConnection $instance = null;\n    private PDO $connection;\n\n    \u002F\u002F 1. Dışarıdan 'new' ile çağrılmayı engelliyoruz\n    private function __construct() {\n        $this->connection = new PDO(\"mysql:host=localhost;dbname=test\", \"user\", \"pass\");\n    }\n\n    \u002F\u002F 2. Nesnenin kopyalanmasını (clone) engelliyoruz\n    private function __clone() {}\n\n    \u002F\u002F 3. Serileştirilmiş dizeden nesne üretilmesini engelliyoruz\n    public function __wakeup() {\n        throw new \\Exception(\"Singleton nesneleri deserialize edilemez.\");\n    }\n\n    \u002F\u002F 4. Tek erişim noktası (Lazy Initialization)\n    public static function getInstance(): DatabaseConnection {\n        if (self::$instance === null) {\n            self::$instance = new self();\n        }\n        return self::$instance;\n    }\n\n    public function getConnection(): PDO {\n        return $this->connection;\n    }\n}\n","php",[63,176,177,185,191,197,204,210,216,222,228,233,239,245,250,256,262,268,273,278,284,290,296,302,308,314,319,324,330,336,341],{"__ignoreMap":116},[178,179,182],"span",{"class":180,"line":181},"line",1,[178,183,184],{},"class DatabaseConnection {\n",[178,186,188],{"class":180,"line":187},2,[178,189,190],{},"    private static ?DatabaseConnection $instance = null;\n",[178,192,194],{"class":180,"line":193},3,[178,195,196],{},"    private PDO $connection;\n",[178,198,200],{"class":180,"line":199},4,[178,201,203],{"emptyLinePlaceholder":202},true,"\n",[178,205,207],{"class":180,"line":206},5,[178,208,209],{},"    \u002F\u002F 1. Dışarıdan 'new' ile çağrılmayı engelliyoruz\n",[178,211,213],{"class":180,"line":212},6,[178,214,215],{},"    private function __construct() {\n",[178,217,219],{"class":180,"line":218},7,[178,220,221],{},"        $this->connection = new PDO(\"mysql:host=localhost;dbname=test\", \"user\", \"pass\");\n",[178,223,225],{"class":180,"line":224},8,[178,226,227],{},"    }\n",[178,229,231],{"class":180,"line":230},9,[178,232,203],{"emptyLinePlaceholder":202},[178,234,236],{"class":180,"line":235},10,[178,237,238],{},"    \u002F\u002F 2. Nesnenin kopyalanmasını (clone) engelliyoruz\n",[178,240,242],{"class":180,"line":241},11,[178,243,244],{},"    private function __clone() {}\n",[178,246,248],{"class":180,"line":247},12,[178,249,203],{"emptyLinePlaceholder":202},[178,251,253],{"class":180,"line":252},13,[178,254,255],{},"    \u002F\u002F 3. Serileştirilmiş dizeden nesne üretilmesini engelliyoruz\n",[178,257,259],{"class":180,"line":258},14,[178,260,261],{},"    public function __wakeup() {\n",[178,263,265],{"class":180,"line":264},15,[178,266,267],{},"        throw new \\Exception(\"Singleton nesneleri deserialize edilemez.\");\n",[178,269,271],{"class":180,"line":270},16,[178,272,227],{},[178,274,276],{"class":180,"line":275},17,[178,277,203],{"emptyLinePlaceholder":202},[178,279,281],{"class":180,"line":280},18,[178,282,283],{},"    \u002F\u002F 4. Tek erişim noktası (Lazy Initialization)\n",[178,285,287],{"class":180,"line":286},19,[178,288,289],{},"    public static function getInstance(): DatabaseConnection {\n",[178,291,293],{"class":180,"line":292},20,[178,294,295],{},"        if (self::$instance === null) {\n",[178,297,299],{"class":180,"line":298},21,[178,300,301],{},"            self::$instance = new self();\n",[178,303,305],{"class":180,"line":304},22,[178,306,307],{},"        }\n",[178,309,311],{"class":180,"line":310},23,[178,312,313],{},"        return self::$instance;\n",[178,315,317],{"class":180,"line":316},24,[178,318,227],{},[178,320,322],{"class":180,"line":321},25,[178,323,203],{"emptyLinePlaceholder":202},[178,325,327],{"class":180,"line":326},26,[178,328,329],{},"    public function getConnection(): PDO {\n",[178,331,333],{"class":180,"line":332},27,[178,334,335],{},"        return $this->connection;\n",[178,337,339],{"class":180,"line":338},28,[178,340,227],{},[178,342,344],{"class":180,"line":343},29,[178,345,346],{},"}\n",[78,348],{},[81,350,352],{"id":351},"singleton-vs-statik-sınıflar-static-class","Singleton vs Statik Sınıflar (Static Class)",[354,355,356,372],"table",{},[357,358,359],"thead",{},[360,361,362,367,369],"tr",{},[363,364,366],"th",{"align":365},"left","Kriter",[363,368,89],{"align":365},[363,370,371],{"align":365},"Statik Sınıf",[373,374,375,389,402],"tbody",{},[360,376,377,383,386],{},[378,379,380],"td",{"align":365},[43,381,382],{},"OOP Uyumu",[378,384,385],{"align":365},"Arayüz (Interface) uygulayabilir, kalıtım (Inheritance) alabilir.",[378,387,388],{"align":365},"Kalıtım ve arayüz uygulayamaz. OOP prensiplerine pek uymaz.",[360,390,391,396,399],{},[378,392,393],{"align":365},[43,394,395],{},"Yükleme Zamanı",[378,397,398],{"align":365},"Nesneye ilk ihtiyaç duyulduğunda oluşturulur (Lazy Loading).",[378,400,401],{"align":365},"Uygulama başlarken direkt belleğe yüklenir (Eager Loading).",[360,403,404,409,412],{},[378,405,406],{"align":365},[43,407,408],{},"Bellek Yönetimi",[378,410,411],{"align":365},"İhtiyaç kalmadığında bellekten temizlenebilir.",[378,413,414],{"align":365},"Uygulama ayakta kaldığı sürece bellekte yer işgal eder.",[78,416],{},[81,418,420],{"id":419},"thread-safety-i̇ş-parçacığı-güvenliği","Thread Safety (İş Parçacığı Güvenliği)",[11,422,423,424,426],{},"PHP, yapısı gereği tek iş parçacıklı (single-threaded) çalıştığı için eş zamanlı erişim sorunlarıyla karşılaşmaz. Ancak Python, Java veya C# gibi çoklu iş parçacığı (multi-threading) destekleyen dillerde iki farklı thread aynı anda ",[63,425,65],{}," metoduna girdiğinde race condition oluşabilir ve iki farklı nesne üretilebilir.",[11,428,429,430,433],{},"Python'da bunu engellemek için bir ",[43,431,432],{},"Lock"," (Kilit) mekanizması kullanılır:",[170,435,439],{"className":436,"code":437,"language":438,"meta":116,"style":116},"language-python shiki shiki-themes github-light github-dark","import threading\n\nclass SingletonMeta(type):\n    _instances = {}\n    _lock: threading.Lock = threading.Lock() # Kilit mekanizması\n\n    def __call__(cls, *args, **kwargs):\n        # Double-checked locking\n        if cls not in cls._instances:\n            with cls._lock:\n                if cls not in cls._instances:\n                    instance = super().__call__(*args, **kwargs)\n                    cls._instances[cls] = instance\n        return cls._instances[cls]\n\nclass Singleton(metaclass=SingletonMeta):\n    def some_business_logic(self):\n        pass\n","python",[63,440,441,446,450,455,460,465,469,474,479,484,489,494,499,504,509,513,518,523],{"__ignoreMap":116},[178,442,443],{"class":180,"line":181},[178,444,445],{},"import threading\n",[178,447,448],{"class":180,"line":187},[178,449,203],{"emptyLinePlaceholder":202},[178,451,452],{"class":180,"line":193},[178,453,454],{},"class SingletonMeta(type):\n",[178,456,457],{"class":180,"line":199},[178,458,459],{},"    _instances = {}\n",[178,461,462],{"class":180,"line":206},[178,463,464],{},"    _lock: threading.Lock = threading.Lock() # Kilit mekanizması\n",[178,466,467],{"class":180,"line":212},[178,468,203],{"emptyLinePlaceholder":202},[178,470,471],{"class":180,"line":218},[178,472,473],{},"    def __call__(cls, *args, **kwargs):\n",[178,475,476],{"class":180,"line":224},[178,477,478],{},"        # Double-checked locking\n",[178,480,481],{"class":180,"line":230},[178,482,483],{},"        if cls not in cls._instances:\n",[178,485,486],{"class":180,"line":235},[178,487,488],{},"            with cls._lock:\n",[178,490,491],{"class":180,"line":241},[178,492,493],{},"                if cls not in cls._instances:\n",[178,495,496],{"class":180,"line":247},[178,497,498],{},"                    instance = super().__call__(*args, **kwargs)\n",[178,500,501],{"class":180,"line":252},[178,502,503],{},"                    cls._instances[cls] = instance\n",[178,505,506],{"class":180,"line":258},[178,507,508],{},"        return cls._instances[cls]\n",[178,510,511],{"class":180,"line":264},[178,512,203],{"emptyLinePlaceholder":202},[178,514,515],{"class":180,"line":270},[178,516,517],{},"class Singleton(metaclass=SingletonMeta):\n",[178,519,520],{"class":180,"line":275},[178,521,522],{},"    def some_business_logic(self):\n",[178,524,525],{"class":180,"line":280},[178,526,527],{},"        pass\n",[78,529],{},[81,531,533],{"id":532},"uygulanabilirlik","Uygulanabilirlik",[47,535,536,542],{},[50,537,538,541],{},[43,539,540],{},"Ortak Kaynak Kontrolü:"," Veritabanı bağlantısı, log yazıcısı veya config dosyaları gibi tüm uygulamanın ortak kullanması gereken tekil kaynaklarda kullanın.",[50,543,544,547],{},[43,545,546],{},"Sıkı Global Kontrol:"," Global değişkenlerin yaratacağı güvenlik açıklarını engellemek ve nesnenin üzerine yazılmasını kesin olarak önlemek istediğinizde kullanın.",[78,549],{},[81,551,553],{"id":552},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[47,555,556,565,572],{},[50,557,558,561,562,564],{},[43,559,560],{},"Facade"," sınıfları genellikle tek bir örneğe ihtiyaç duydukları için ",[43,563,89],{}," olarak tasarlanabilirler.",[50,566,567,568,571],{},"Paylaşılan tüm durumlar tek bir nesneye indirgenebilirse ",[43,569,570],{},"Flyweight"," deseni Singleton ile benzerlik gösterir. Ancak Flyweight nesneleri immutable (değiştirilemez) olmak zorundadır.",[50,573,574,577,578,581,582,585],{},[43,575,576],{},"Abstract Factory",", ",[43,579,580],{},"Builder"," ve ",[43,583,584],{},"Prototype"," desenleri çoğunlukla Singleton olarak uygulanabilir.",[78,587],{},[81,589,591],{"id":590},"singleton-tasarım-deseni-kod-örnekleri","Singleton Tasarım Deseni Kod Örnekleri",[101,593,595],{"id":594},"örnek-php-kodu","Örnek PHP Kodu",[170,597,599],{"className":172,"code":598,"language":174,"meta":116,"style":116},"\u003C?php\n\nnamespace RefactoringGuru\\Singleton\\Conceptual;\n\nclass Singleton\n{\n    private static array $instances = [];\n\n    protected function __construct() { }\n\n    protected function __clone() { }\n\n    public function __wakeup()\n    {\n        throw new \\Exception(\"Singleton deserialize edilemez.\");\n    }\n\n    public static function getInstance(): Singleton\n    {\n        $cls = static::class;\n        if (!isset(self::$instances[$cls])) {\n            self::$instances[$cls] = new static();\n        }\n\n        return self::$instances[$cls];\n    }\n\n    public function someBusinessLogic()\n    {\n        \u002F\u002F İş mantığı kodları\n    }\n}\n\nfunction clientCode()\n{\n    $s1 = Singleton::getInstance();\n    $s2 = Singleton::getInstance();\n    if ($s1 === $s2) {\n        echo \"Singleton çalışıyor, iki değişken de aynı örneği içeriyor.\";\n    } else {\n        echo \"Singleton başarısız, değişkenler farklı örneklere sahip.\";\n    }\n}\n\nclientCode();\n",[63,600,601,606,610,615,619,624,629,634,638,643,647,652,656,661,666,671,675,679,684,688,693,698,703,707,711,716,720,724,729,733,739,744,749,754,760,765,771,777,783,789,795,801,806,811,816],{"__ignoreMap":116},[178,602,603],{"class":180,"line":181},[178,604,605],{},"\u003C?php\n",[178,607,608],{"class":180,"line":187},[178,609,203],{"emptyLinePlaceholder":202},[178,611,612],{"class":180,"line":193},[178,613,614],{},"namespace RefactoringGuru\\Singleton\\Conceptual;\n",[178,616,617],{"class":180,"line":199},[178,618,203],{"emptyLinePlaceholder":202},[178,620,621],{"class":180,"line":206},[178,622,623],{},"class Singleton\n",[178,625,626],{"class":180,"line":212},[178,627,628],{},"{\n",[178,630,631],{"class":180,"line":218},[178,632,633],{},"    private static array $instances = [];\n",[178,635,636],{"class":180,"line":224},[178,637,203],{"emptyLinePlaceholder":202},[178,639,640],{"class":180,"line":230},[178,641,642],{},"    protected function __construct() { }\n",[178,644,645],{"class":180,"line":235},[178,646,203],{"emptyLinePlaceholder":202},[178,648,649],{"class":180,"line":241},[178,650,651],{},"    protected function __clone() { }\n",[178,653,654],{"class":180,"line":247},[178,655,203],{"emptyLinePlaceholder":202},[178,657,658],{"class":180,"line":252},[178,659,660],{},"    public function __wakeup()\n",[178,662,663],{"class":180,"line":258},[178,664,665],{},"    {\n",[178,667,668],{"class":180,"line":264},[178,669,670],{},"        throw new \\Exception(\"Singleton deserialize edilemez.\");\n",[178,672,673],{"class":180,"line":270},[178,674,227],{},[178,676,677],{"class":180,"line":275},[178,678,203],{"emptyLinePlaceholder":202},[178,680,681],{"class":180,"line":280},[178,682,683],{},"    public static function getInstance(): Singleton\n",[178,685,686],{"class":180,"line":286},[178,687,665],{},[178,689,690],{"class":180,"line":292},[178,691,692],{},"        $cls = static::class;\n",[178,694,695],{"class":180,"line":298},[178,696,697],{},"        if (!isset(self::$instances[$cls])) {\n",[178,699,700],{"class":180,"line":304},[178,701,702],{},"            self::$instances[$cls] = new static();\n",[178,704,705],{"class":180,"line":310},[178,706,307],{},[178,708,709],{"class":180,"line":316},[178,710,203],{"emptyLinePlaceholder":202},[178,712,713],{"class":180,"line":321},[178,714,715],{},"        return self::$instances[$cls];\n",[178,717,718],{"class":180,"line":326},[178,719,227],{},[178,721,722],{"class":180,"line":332},[178,723,203],{"emptyLinePlaceholder":202},[178,725,726],{"class":180,"line":338},[178,727,728],{},"    public function someBusinessLogic()\n",[178,730,731],{"class":180,"line":343},[178,732,665],{},[178,734,736],{"class":180,"line":735},30,[178,737,738],{},"        \u002F\u002F İş mantığı kodları\n",[178,740,742],{"class":180,"line":741},31,[178,743,227],{},[178,745,747],{"class":180,"line":746},32,[178,748,346],{},[178,750,752],{"class":180,"line":751},33,[178,753,203],{"emptyLinePlaceholder":202},[178,755,757],{"class":180,"line":756},34,[178,758,759],{},"function clientCode()\n",[178,761,763],{"class":180,"line":762},35,[178,764,628],{},[178,766,768],{"class":180,"line":767},36,[178,769,770],{},"    $s1 = Singleton::getInstance();\n",[178,772,774],{"class":180,"line":773},37,[178,775,776],{},"    $s2 = Singleton::getInstance();\n",[178,778,780],{"class":180,"line":779},38,[178,781,782],{},"    if ($s1 === $s2) {\n",[178,784,786],{"class":180,"line":785},39,[178,787,788],{},"        echo \"Singleton çalışıyor, iki değişken de aynı örneği içeriyor.\";\n",[178,790,792],{"class":180,"line":791},40,[178,793,794],{},"    } else {\n",[178,796,798],{"class":180,"line":797},41,[178,799,800],{},"        echo \"Singleton başarısız, değişkenler farklı örneklere sahip.\";\n",[178,802,804],{"class":180,"line":803},42,[178,805,227],{},[178,807,809],{"class":180,"line":808},43,[178,810,346],{},[178,812,814],{"class":180,"line":813},44,[178,815,203],{"emptyLinePlaceholder":202},[178,817,819],{"class":180,"line":818},45,[178,820,821],{},"clientCode();\n",[101,823,825],{"id":824},"örnek-python-kodu","Örnek Python Kodu",[170,827,829],{"className":436,"code":828,"language":438,"meta":116,"style":116},"class SingletonMeta(type):\n    _instances = {}\n\n    def __call__(cls, *args, **kwargs):\n        if cls not in cls._instances:\n            instance = super().__call__(*args, **kwargs)\n            cls._instances[cls] = instance\n        return cls._instances[cls]\n\n\nclass Singleton(metaclass=SingletonMeta):\n    def some_business_logic(self):\n        pass\n\n\nif __name__ == \"__main__\":\n    s1 = Singleton()\n    s2 = Singleton()\n\n    if id(s1) == id(s2):\n        print(\"Singleton çalışıyor, iki değişken de aynı örneği içeriyor.\")\n    else:\n        print(\"Singleton başarısız, değişkenler farklı örneklere sahip.\")\n",[63,830,831,835,839,843,847,851,856,861,865,869,873,877,881,885,889,893,898,903,908,912,917,922,927],{"__ignoreMap":116},[178,832,833],{"class":180,"line":181},[178,834,454],{},[178,836,837],{"class":180,"line":187},[178,838,459],{},[178,840,841],{"class":180,"line":193},[178,842,203],{"emptyLinePlaceholder":202},[178,844,845],{"class":180,"line":199},[178,846,473],{},[178,848,849],{"class":180,"line":206},[178,850,483],{},[178,852,853],{"class":180,"line":212},[178,854,855],{},"            instance = super().__call__(*args, **kwargs)\n",[178,857,858],{"class":180,"line":218},[178,859,860],{},"            cls._instances[cls] = instance\n",[178,862,863],{"class":180,"line":224},[178,864,508],{},[178,866,867],{"class":180,"line":230},[178,868,203],{"emptyLinePlaceholder":202},[178,870,871],{"class":180,"line":235},[178,872,203],{"emptyLinePlaceholder":202},[178,874,875],{"class":180,"line":241},[178,876,517],{},[178,878,879],{"class":180,"line":247},[178,880,522],{},[178,882,883],{"class":180,"line":252},[178,884,527],{},[178,886,887],{"class":180,"line":258},[178,888,203],{"emptyLinePlaceholder":202},[178,890,891],{"class":180,"line":264},[178,892,203],{"emptyLinePlaceholder":202},[178,894,895],{"class":180,"line":270},[178,896,897],{},"if __name__ == \"__main__\":\n",[178,899,900],{"class":180,"line":275},[178,901,902],{},"    s1 = Singleton()\n",[178,904,905],{"class":180,"line":280},[178,906,907],{},"    s2 = Singleton()\n",[178,909,910],{"class":180,"line":286},[178,911,203],{"emptyLinePlaceholder":202},[178,913,914],{"class":180,"line":292},[178,915,916],{},"    if id(s1) == id(s2):\n",[178,918,919],{"class":180,"line":298},[178,920,921],{},"        print(\"Singleton çalışıyor, iki değişken de aynı örneği içeriyor.\")\n",[178,923,924],{"class":180,"line":304},[178,925,926],{},"    else:\n",[178,928,929],{"class":180,"line":310},[178,930,931],{},"        print(\"Singleton başarısız, değişkenler farklı örneklere sahip.\")\n",[78,933],{},[81,935,937],{"id":936},"sıkça-sorulan-sorular-faq","Sıkça Sorulan Sorular (FAQ)",[101,939,941],{"id":940},"singleton-neden-bir-anti-pattern-olarak-kabul-ediliyor","Singleton neden bir anti-pattern olarak kabul ediliyor?",[47,943,944,950,960],{},[50,945,946,949],{},[43,947,948],{},"Test Edilebilirliği Zorlaştırır:"," Birim testlerinde (unit test) nesnelerin izole edilmesi istenir. Singleton global bir durum barındırdığı için bir testten kalan veriler diğer testleri etkileyebilir (test pollution). Mock edilmesi (taklit edilmesi) zordur.",[50,951,952,955,956,959],{},[43,953,954],{},"Sıkı Bağımlılık Yaratır:"," Sınıfların içine doğrudan ",[63,957,958],{},"Singleton::getInstance()"," yazmak, o sınıfı Singleton sınıfına sıkı sıkıya bağımlı kılar.",[50,961,962,965],{},[43,963,964],{},"SRP Prensibini Bozar:"," Sınıf hem kendi asıl işini yapar hem de kendi örneğinin yaşam döngüsünü kontrol eder.",[101,967,969],{"id":968},"dependency-injection-di-varken-singletona-gerek-var-mı","Dependency Injection (DI) varken Singleton'a gerek var mı?",[11,971,972,973,976],{},"Modern framework mimarilerinde (Laravel, Symfony, Spring, NestJS vb.) Singleton deseni el ile kurulmaz. Bunun yerine ",[43,974,975],{},"Dependency Injection Container"," (Bağımlılık Enjeksiyonu Konteyneri) kullanılır. Sınıf normal şekilde tasarlanır ve DI container'a \"Singleton\" yaşam döngüsüyle kaydedilir. Nesnenin tek bir örneğinin olmasını ve yönetilmesini DI Container üstlenir. Bu sayede test edilebilir ve esnek bir mimari elde edilir.",[101,978,980,981,581,984,987],{"id":979},"phpde-__clone-ve-__wakeup-metotları-neden-privateprotected-yapılır","PHP'de ",[63,982,983],{},"__clone",[63,985,986],{},"__wakeup"," metotları neden private\u002Fprotected yapılır?",[11,989,980,990,993,994,997],{},[63,991,992],{},"clone $instance"," çağrısı yapıldığında nesnenin kopyası oluşturulur. ",[63,995,996],{},"unserialize()"," çağrısı ise dizeye dönüştürülmüş nesneyi tekrar hayata döndürürken constructor'ı çalıştırmadan yeni bir nesne üretir. Bu durum tekillik ilkesini bozar. Bu nedenle bu iki sihirli metot (magic method) kapatılarak devre dışı bırakılır.",[78,999],{},[81,1001,1003],{"id":1002},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[11,1005,1006],{},[43,1007,1008],{},"Oluşumsal Kalıplar (Creational Patterns)",[11,1010,1011,1015,1016,1015,1019,1015,1022,1015,1025],{},[15,1012,1014],{"href":1013},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method",",\n",[15,1017,576],{"href":1018},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir",[15,1020,580],{"href":1021},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir",[15,1023,584],{"href":1024},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir",[15,1026,89],{"href":1027},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir",[11,1029,1030],{},[43,1031,1032],{},"Yapısal Kalıplar (Structural Patterns)",[11,1034,1035,1015,1039,1015,1043,1015,1047,1015,1051,1015,1054,1015,1057],{},[15,1036,1038],{"href":1037},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter",[15,1040,1042],{"href":1041},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[15,1044,1046],{"href":1045},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite",[15,1048,1050],{"href":1049},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator",[15,1052,560],{"href":1053},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir",[15,1055,570],{"href":1056},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir",[15,1058,1060],{"href":1059},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[11,1062,1063],{},[43,1064,1065],{},"Davranışsal Kalıplar (Behavioral Patterns)",[11,1067,1068,1015,1072,1015,1076,1015,1080,1015,1084,1015,1088,1015,1092,1015,1096,1015,1100,1015,1104],{},[15,1069,1071],{"href":1070},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[15,1073,1075],{"href":1074},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[15,1077,1079],{"href":1078},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[15,1081,1083],{"href":1082},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[15,1085,1087],{"href":1086},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[15,1089,1091],{"href":1090},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[15,1093,1095],{"href":1094},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[15,1097,1099],{"href":1098},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[15,1101,1103],{"href":1102},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[15,1105,1107],{"href":1106},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1109,1110,1111],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":116,"searchDepth":187,"depth":187,"links":1113},[1114,1115,1119,1120,1121,1122,1123,1124,1125,1129,1135],{"id":83,"depth":187,"text":84},{"id":95,"depth":187,"text":96,"children":1116},[1117,1118],{"id":103,"depth":193,"text":104},{"id":120,"depth":193,"text":121},{"id":132,"depth":187,"text":133},{"id":164,"depth":187,"text":165},{"id":351,"depth":187,"text":352},{"id":419,"depth":187,"text":420},{"id":532,"depth":187,"text":533},{"id":552,"depth":187,"text":553},{"id":590,"depth":187,"text":591,"children":1126},[1127,1128],{"id":594,"depth":193,"text":595},{"id":824,"depth":193,"text":825},{"id":936,"depth":187,"text":937,"children":1130},[1131,1132,1133],{"id":940,"depth":193,"text":941},{"id":968,"depth":193,"text":969},{"id":979,"depth":193,"text":1134},"PHP'de __clone ve __wakeup metotları neden private\u002Fprotected yapılır?",{"id":1002,"depth":187,"text":1003},[1137],"technical",null,"2021-08-17","Singleton (Tekil) tasarım kalıbını, kullanım alanlarını, anti-pattern tartışmalarını ve PHP\u002FPython örneklerini öğrenin.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F08\u002Fsingleton-pattern.avif",{},{"title":6,"description":1140},"singleton-tasarim-deseni-nedir","tr\u002Fsingleton-tasarim-deseni-nedir",[1149,1150],"design-pattern","ipucu","JuDyE8OmITk7xQBRdxVxTYmeGBPJ_eQ3VrAd2k0hegs",{"prev":1153,"next":1156,"others":1158,"lucky":1271,"readingTime":212},{"path":1154,"title":1155},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":1024,"title":1157},"Prototype Tasarım Deseni Nedir?",[1159,1162,1165,1168,1171,1172,1175,1178,1181,1184,1186,1189,1192,1195,1198,1201,1204,1206,1209,1212,1215,1218,1221,1224,1227,1230,1232,1235,1237,1239,1242,1245,1248,1251,1254,1257,1260,1263,1266,1268],{"path":1160,"title":1161},"\u002Ftr\u002Fes6-nedir-ecmascript-2015-nedir","ES6 Nedir? ECMAScript 2015 Nedir?",{"path":1163,"title":1164},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir","Go ile WebSockets: Upgrader Nedir?",{"path":1166,"title":1167},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",{"path":1169,"title":1170},"\u002Ftr\u002Fdigital-oceanda-vps-kurulumu","DigitalOcean'da VPS (Droplet) Kurulumu: Adım Adım Rehber",{"path":1154,"title":1155},{"path":1173,"title":1174},"\u002Ftr\u002Fmerhaba-phalcon-framework","Merhaba Phalcon Framework",{"path":1176,"title":1177},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",{"path":1179,"title":1180},"\u002Ftr\u002Faws-ec2-uzerinde-docker-ve-full-stack-web-performansi","AWS EC2 Üzerinde Docker ve Full Stack Web Performansı",{"path":1182,"title":1183},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct",{"path":1059,"title":1185},"Proxy Tasarım Deseni Nedir?",{"path":1187,"title":1188},"\u002Ftr\u002Fphp-8-0-yenilikler","Merhaba PHP 8: Modern PHP 8.x Çağı",{"path":1190,"title":1191},"\u002Ftr\u002Ftailwind-css-nerede-kullanilir-tailwind-css-nerede-kullanilmaz","Tailwind CSS Nerede Kullanılır? Tailwind CSS Nerede Kullanılmaz?",{"path":1193,"title":1194},"\u002Ftr\u002Fubuntu-20-04-uzerinde-cyberpanel-kurulumu","Ubuntu 20.04 üzerinde CyberPanel kurulumu",{"path":1196,"title":1197},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu",{"path":1199,"title":1200},"\u002Ftr\u002Fvite-nedir","Vite Nedir? Modern Web Geliştirme ve Paketleme Aracı",{"path":1202,"title":1203},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",{"path":1070,"title":1205},"Chain of Responsibility Deseni Nedir?",{"path":1207,"title":1208},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1210,"title":1211},"\u002Ftr\u002Fcodeserver-nedir-codeserver-nasil-kurulur","Code-Server Nedir? Bulutta VS Code Geliştirme Ortamı Kurulumu",{"path":1213,"title":1214},"\u002Ftr\u002Fnostalji-ibibik-online","Nostalji: İbibik Online (1998'den Bir Web Macerası)",{"path":1216,"title":1217},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":1219,"title":1220},"\u002Ftr\u002Fes13-nedir-ecmascript-2022-nedir","ES13 nedir? ECMAScript 2022 nedir?",{"path":1222,"title":1223},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1225,"title":1226},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1228,"title":1229},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1098,"title":1231},"Strategy Tasarım Deseni Nedir?",{"path":1233,"title":1234},"\u002Ftr\u002Fdocker-ile-mongodb-kurulumu","Docker ile MongoDB Kurulumu",{"path":1056,"title":1236},"Flyweight Tasarım Deseni Nedir?",{"path":1102,"title":1238},"Template Method Tasarım Deseni Nedir?",{"path":1240,"title":1241},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama",{"path":1243,"title":1244},"\u002Ftr\u002Fgraylog-nedir-docker-ile-nasil-kurulur","Graylog Nedir? Docker Compose ile Adım Adım Kurulum Rehberi",{"path":1246,"title":1247},"\u002Ftr\u002Fprogralama-ipucu-yoda-gosterimi","Yoda Koşulları (Yoda Conditions) Nedir? Programlama İpucu",{"path":1249,"title":1250},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":1252,"title":1253},"\u002Ftr\u002Frestful-api-bilesenleri","RESTful API Bileşenleri",{"path":1255,"title":1256},"\u002Ftr\u002Fes16-nedir-ecmascript-2025-nedir","ES16 nedir? ECMAScript 2025 nedir?",{"path":1258,"title":1259},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1261,"title":1262},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":1264,"title":1265},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1106,"title":1267},"Visitor Tasarım Deseni Nedir?",{"path":1269,"title":1270},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu",{"path":1272,"title":1273},"\u002Ftr\u002Flitespeed-web-server-performans-artisi","Konfor Alanından Çıkıp, Konforlu Bir VPS'e Geçmek: LiteSpeed Web Server",[1275,1277,1279,1281],{"path":1106,"title":1267,"date":1276},"2021-10-09",{"path":1102,"title":1238,"date":1278},"2021-10-08",{"path":1098,"title":1231,"date":1280},"2021-10-07",{"path":1094,"title":1282,"date":1283},"State Tasarım Deseni Nedir?","2021-10-06",[1285,1288,1292],{"path":1053,"title":1286,"date":1287},"Facade Tasarım Deseni Nedir?","2021-09-13",{"path":1289,"title":1290,"date":1291},"\u002Ftr\u002Fjavascriptde-moduller","JavaScript'te Modüller","2020-12-11",{"path":1246,"title":1247,"date":1293},"2021-07-23",1782142064417]