[{"data":1,"prerenderedAt":1854},["ShallowReactive",2],{"post-\u002Ftr\u002Fflyweight-tasarim-deseni-nedir":3},{"page":4,"translation":1699,"nav":1713,"related":1834,"random":1845},{"id":5,"title":6,"body":7,"categories":1697,"category":1699,"date":1700,"description":1701,"draft":1702,"extension":1703,"image":1704,"kind":1699,"lang":203,"meta":1705,"navigation":394,"path":1624,"readingTime":433,"seo":1706,"slug":1707,"stem":1708,"tags":1709,"translationKey":1699,"type":1698,"updated":1699,"__hash__":1712},"postsTr\u002Ftr\u002Fflyweight-tasarim-deseni-nedir.md","Flyweight Tasarım Deseni Nedir?",{"type":8,"value":9,"toc":1680},"minimark",[10,51,60,73,76,79,84,90,92,96,99,102,105,112,114,118,125,131,134,145,148,154,161,166,169,180,186,189,192,196,272,274,278,281,283,287,295,297,301,306,309,320,322,326,362,364,368,372,1110,1114,1565,1567,1571,1576,1597,1602,1629,1634,1676],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Özet (TL;DR):",[22,23,24,31,37],"ul",{},[25,26,27,30],"li",{},[18,28,29],{},"Amacı:"," Benzer nesnelerin ortak özelliklerini (içsel durum\u002Fintrinsic state) paylaşarak bellek (RAM) kullanımını minimize eden yapısal (structural) bir tasarım desenidir.",[25,32,33,36],{},[18,34,35],{},"Çözdüğü Sorun:"," Çok sayıda nesne oluşturulması gereken durumlarda (örneğin oyunlardaki partikül sistemleri) nesne başına düşen bellek maliyetini azaltarak uygulamanın yetersiz bellek nedeniyle çökmesini engeller.",[25,38,39,42,43,46,47,50],{},[18,40,41],{},"Yöntem:"," Nesne durumu ikiye ayrılır: Değişmeyen veriler (",[18,44,45],{},"İçsel Durum",") Flyweight nesnesinin içinde kalır; değişen veriler (",[18,48,49],{},"Dışsal Durum",") ise dışarıya taşınır ve Flyweight metotlarına parametre olarak geçilir.",[14,52,53,54,59],{},"Bu yazı ",[55,56,58],"a",{"href":57},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns\u002FTasarım Desenleri nedir?"," başlıklı yazı dizisinin bir parçasıdır.",[14,61,62,63,72],{},"Bu içerik ağırlıklı olarak ",[55,64,71],{"href":65,"rel":66,"target":70},"https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns",[67,68,69],"nofollow","noopener","noreferrer","_blank","refactoring.guru"," sitesindeki içeriğin tercümesi ve derlenmesinden oluşturulmuştur.",[14,74,75],{},"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.",[77,78],"hr",{},[80,81,83],"h2",{"id":82},"flyweight-tasarım-deseninin-amacı","Flyweight Tasarım Deseninin Amacı",[14,85,86,89],{},[18,87,88],{},"Flyweight",", her bir nesnede tüm verileri tutmak yerine, ortak kısımları paylaşarak mevcut bellek (RAM) miktarına daha fazla nesne sığdırmanıza olanak sağlayan bir yapısal tasarım desenidir.",[77,91],{},[80,93,95],{"id":94},"sorun","Sorun",[14,97,98],{},"Uzun çalışma saatlerinden sonra biraz eğlenmek için basit bir oyun yapmaya karar verdiniz. Bu oyunda oyuncular küçük bir harita üzerinde dolaşarak birbirlerine vuracaklar. \"Madem yapıyorum, şöyle gerçekçi bir partikül sistemi ekleyeyim, şaşaalı bir şey yapayım\" dediniz. Çok oyunculu bu oyunda her yerden fırlayan mermiler, roketler ve patlamalardan etrafa saçılan şarapnel parçaları ile muazzam bir oyuncu deneyimi yaşatabileceğinizi düşündünüz.",[14,100,101],{},"Oyunu tamamladınız, build aldınız ve test etmesi için arkadaşınıza gönderdiniz. Oyun sizin makinenizde harika çalışmasına rağmen arkadaşınızda kısa süre sonra yavaşlama ve donmalar başladı; birkaç dakikalık oyun süresinden sonra oyun kilitlenip kapandı. Debug kayıtlarını kurcalayarak saatler harcadıktan sonra oyunun yetersiz RAM miktarı yüzünden çöktüğünü fark ettiniz. Arkadaşınızın bilgisayarı sizinkine göre daha güçsüz olduğu için siz bu sorunla karşılaşmazken o kısa sürede sorun yaşadı.",[14,103,104],{},"Sorunun partikül sisteminden kaynaklandığını fark ettiniz. Kurşun, roket veya şarapnel parçası gibi her bir partikül ayrı bir nesne olarak ekranda yer alıyor ve ciddi miktarda veri içeriyordu. Oyuncunun ekranında partikül sayısı artıp sınırı zorladıkça yeni partiküller artık RAM'e sığmıyor ve oyunun çökmesine neden oluyordu.",[14,106,107],{},[108,109],"img",{"alt":110,"src":111},"Flyweight tasarım deseni hangi sorunu çözer?","\u002Fimages\u002Fflyweight-tasarim-deseni-nedir\u002Fflyweight-tasarim-deseni-problem.avif",[77,113],{},[80,115,117],{"id":116},"çözüm","Çözüm",[14,119,120,124],{},[121,122,123],"code",{},"Particle"," sınıfını yakından incelediğinizde, renk ve sprite alanlarının diğerlerine göre çok daha fazla yer kapladığını, daha da kötüsü bu alanların aslında tüm partiküllerde aynı ya da benzer olduğunu gördünüz. Örneğin tüm mermiler aynı renk ve sprite'a sahipti.",[14,126,127],{},[108,128],{"alt":129,"src":130},"Flyweight tasarım deseni nedir?","\u002Fimages\u002Fflyweight-tasarim-deseni-nedir\u002Fflyweight-tasarim-deseni-cozum1.avif",[14,132,133],{},"Partikülün koordinat, hareket vektörü ve hızı gibi diğer özellikleri her partikül için benzersizdi ve zamanla değişiyordu. Bu veri partikülün yaşamı boyunca değişkenken renk ve sprite özellikleri her partikül için sabitti.",[14,135,136,137,140,141,144],{},"Bir nesnenin bu gibi sabit verilerine genellikle ",[18,138,139],{},"içsel durum (intrinsic state)"," denir. Bu bilgiler nesnenin içinde saklanır, diğer nesneler bu verileri okuyabilir fakat değiştiremez. Nesnenin diğer durumları genellikle nesnenin dışındaki diğer nesneler tarafından değiştirilir ve bunlara da ",[18,142,143],{},"dışsal durum (extrinsic state)"," denir.",[14,146,147],{},"Flyweight deseni dışsal durumu nesnenin içinde saklamamanızı, bunun yerine bu durum verisine ihtiyacı olan metotlara aktarmanızı tavsiye eder. Nesnenin içinde sadece içsel durum yer alır ve farklı bağlamlarda (context) yeniden kullanılabilir. Sonuç olarak sadece içsel durumları farklı olan, daha az sayıda nesneye ihtiyacınız olur.",[14,149,150],{},[108,151],{"alt":152,"src":153},"Flyweight tasarım deseni ne sağlar?","\u002Fimages\u002Fflyweight-tasarim-deseni-nedir\u002Fflyweight-tasarim-deseni-cozum3.avif",[14,155,156,157,144],{},"Tekrar oyunumuza geri dönelim. Dışsal durumu partikül sınıfımızın dışına aldığımızı düşünürsek oyundaki tüm partikülleri sadece 3 nesne ile ifade edebiliriz: mermi, roket ve şarapnel parçası. Tahmin edeceğiniz üzere sadece içsel durumu saklayan bu nesnelere ",[158,159,160],"em",{},"flyweight",[162,163,165],"h3",{"id":164},"dışsal-durum-extrinsic-state-saklama-alanı","Dışsal Durum (Extrinsic State) Saklama Alanı",[14,167,168],{},"Nesnenin içinde sadece içsel durumu bıraktık, peki ya dışsal durum değişkenleri nereye gidecek? Bir nesnenin bu değerleri saklıyor olması lazım değil mi? Çoğu durumda bunlar, deseni uygulamadan önce nesneleri toparlayan kapsayıcı (container) nesnesinin içine gider.",[14,170,171,172,175,176,179],{},"Bizim oyunumuzda bu partikülleri ",[121,173,174],{},"particles"," alanında saklayan ana ",[121,177,178],{},"Game"," nesnesidir. Dışsal durumu bu sınıfın içine taşımak için her partikülün koordinatları, vektörleri ve hızını içeren dizi (array) alanlarına ihtiyacımız olacaktır. Fakat bununla bitmez, bir alanda da bu partikülü temsil eden spesifik flyweight nesnesinin referansını saklamanız gerekir.",[14,181,182],{},[108,183],{"alt":184,"src":185},"Flyweight tasarım deseni","\u002Fimages\u002Fflyweight-tasarim-deseni-nedir\u002Fflyweight-tasarim-deseni-cozum2.avif",[14,187,188],{},"Daha şık bir çözüm ise bir bağlam sınıfı (context class) oluşturup dışsal durum (extrinsic state) ve flyweight nesnesinin referansını bu sınıfta tutmaktır. Game sınıfımız içinde ise bu sınıflardan oluşan tek bir dizi (array) değişkeni tutmak olacaktır.",[14,190,191],{},"Ama bir dakika, bunun bize ne faydası oldu? İlk başta oluşturduğumuz nesne sayısı kadar bu bağlam nesnelerinden oluşturmamız gerekmeyecek mi? Teknik olarak evet, fakat bu nesneler öncekilere göre çok daha küçük. Sonuç olarak en fazla hafıza işgal eden bölüm flyweight nesnesinin içine aktarıldı. Şimdi binlerce küçük bağlam nesnesi tek bir büyük flyweight nesnesine referans vererek aynı verinin binlerce kopyası yerine sadece tek bir kopya kullanabilecek.",[162,193,195],{"id":194},"flyweight-durum-ayrımı-i̇çsel-vs-dışsal-durum","Flyweight Durum Ayrımı: İçsel vs. Dışsal Durum",[197,198,199,216],"table",{},[200,201,202],"thead",{},[203,204,205,210,213],"tr",{},[206,207,209],"th",{"align":208},"left","Özellik",[206,211,212],{"align":208},"İçsel Durum (Intrinsic State)",[206,214,215],{"align":208},"Dışsal Durum (Extrinsic State)",[217,218,219,233,246,259],"tbody",{},[203,220,221,227,230],{},[222,223,224],"td",{"align":208},[18,225,226],{},"Tanım",[222,228,229],{"align":208},"Nesnenin kimliğini oluşturan ve değişmeyen sabit veriler.",[222,231,232],{"align":208},"Nesnenin içinde bulunduğu bağlama göre değişen dinamik veriler.",[203,234,235,240,243],{},[222,236,237],{"align":208},[18,238,239],{},"Örnek (Oyun Partikülü)",[222,241,242],{"align":208},"Merminin rengi, dokusu (sprite\u002Ftexture), görsel boyutu.",[222,244,245],{"align":208},"Merminin o anki X\u002FY koordinatları, hızı, hareket vektörü.",[203,247,248,253,256],{},[222,249,250],{"align":208},[18,251,252],{},"Depolama Yeri",[222,254,255],{"align":208},"Flyweight nesnesinin içinde saklanır.",[222,257,258],{"align":208},"İstemci\u002Fkapsayıcı (container) sınıfta saklanır.",[203,260,261,266,269],{},[222,262,263],{"align":208},[18,264,265],{},"Paylaşım",[222,267,268],{"align":208},"Birden fazla nesne tarafından ortaklaşa paylaşılır.",[222,270,271],{"align":208},"Paylaşılamaz; her nesne örneği için benzersizdir.",[77,273],{},[80,275,277],{"id":276},"flyweight-ve-değişmezlik","Flyweight ve Değişmezlik",[14,279,280],{},"Flyweight nesnesi farklı bağlamlar (context) içinden kullanılabileceği için durumunun (state) değiştirilemez olduğundan emin olmalısınız. Bir flyweight nesnesi constructor parametreleri ile bir kere oluşturulduktan sonra değiştirilememeli, herhangi bir public alan veya setter metodu içermemelidir.",[77,282],{},[80,284,286],{"id":285},"flyweight-factory","Flyweight Factory",[14,288,289,290,294],{},"Birden çok flyweight nesne içinden gerekene daha rahat ulaşabilmek için mevcut flyweight nesnelerini bir havuzda tutacak bir ",[55,291,293],{"href":292},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","factory method"," oluşturabilirsiniz. Bu metot, oluşturulmak istenen flyweight nesnesinin içsel durumunu bir parametre olarak alır, mevcut flyweight nesneleri arasında bu içsel durumla örtüşen var mı bakar ve eğer bulursa onu döndürür, bulamazsa yeni bir nesne oluşturur ve onu da bu havuza dahil eder.",[77,296],{},[80,298,300],{"id":299},"uygulanabilirlik","Uygulanabilirlik",[14,302,303],{},[18,304,305],{},"Belirli bir nesnenin çok fazla sayıda kopyası oluşturulup hafızada da daha az yer kaplaması isteniyorsa Flyweight tasarım kalıbı kullanılabilir.",[14,307,308],{},"Bu desenin sağladığı faydalar nerede ve nasıl kullanıldığı ile doğrudan ilgilidir. En kullanışlı olduğu durumlar:",[22,310,311,314,317],{},[25,312,313],{},"Uygulamanın birbirine benzer çok fazla sayıda nesneyi oluşturması gerekiyorsa,",[25,315,316],{},"Bu durum hedef makinedeki tüm hafızayı tüketiyorsa (veya örneğin backend uygulamalarında mevcut hafıza ile daha fazla istek karşılanabilmesi isteniyorsa),",[25,318,319],{},"Nesneler birbirinin aynı durumlara sahip ve bu durumları ayrıştırıp nesneler arasında paylaştırmak mümkünse.",[77,321],{},[80,323,325],{"id":324},"diğer-tasarım-desenleri-ile-i̇lişkisi","Diğer Tasarım Desenleri ile İlişkisi",[22,327,328,334,343],{},[25,329,330,333],{},[18,331,332],{},"Composite"," tasarım deseninde ortak kullanılan yaprakları Flyweight olarak tasarlayarak hafızadan tasarruf edebilirsiniz.",[25,335,336,338,339,342],{},[18,337,88],{}," çok sayıda küçük nesne oluşturmayı sağlarken ",[18,340,341],{},"Facade"," tek bir nesnenin geniş bir sistemi kapsamasını sağlar.",[25,344,345,346,348,349,352,353],{},"Eğer nesnelerin paylaştıkları durumları tek bir flyweight nesnesine indirgeyebiliyorsanız ",[18,347,88],{},"'lar ",[18,350,351],{},"Singleton"," olabilir. Fakat bu iki desen arasındaki iki önemli fark unutulmamalıdır:\n",[354,355,356,359],"ol",{},[25,357,358],{},"Sadece tek bir Singleton örneği olması gerekirken, Flyweight sınıflarının farklı iç durumları tanımlayan birden fazla örneği olabilir.",[25,360,361],{},"Singleton nesneler değiştirilebilir (mutable) olabilirken, Flyweight nesneleri değiştirilemezdir (immutable).",[77,363],{},[80,365,367],{"id":366},"flyweight-deseni-kod-örnekleri","Flyweight Deseni Kod Örnekleri",[162,369,371],{"id":370},"örnek-php-kodu","Örnek PHP Kodu",[373,374,379],"pre",{"className":375,"code":376,"language":377,"meta":378,"style":378},"language-php shiki shiki-themes github-light github-dark","\u003C?php\n\nnamespace RefactoringGuru\\Flyweight\\Conceptual;\n\n\u002F**\n * The Flyweight stores a common portion of the state (also called intrinsic\n * state) that belongs to multiple real business entities. The Flyweight accepts\n * the rest of the state (extrinsic state, unique for each entity) via its\n * method parameters.\n *\u002F\nclass Flyweight\n{\n    private $sharedState;\n\n    public function __construct($sharedState)\n    {\n        $this->sharedState = $sharedState;\n    }\n\n    public function operation($uniqueState): void\n    {\n        $s = json_encode($this->sharedState);\n        $u = json_encode($uniqueState);\n        echo \"Flyweight: Displaying shared ($s) and unique ($u) state.\\n\";\n    }\n}\n\n\u002F**\n * The Flyweight Factory creates and manages the Flyweight objects. It ensures\n * that flyweights are shared correctly. When the client requests a flyweight,\n * the factory either returns an existing instance or creates a new one, if it\n * doesn't exist yet.\n *\u002F\nclass FlyweightFactory\n{\n    \u002F**\n     * @var Flyweight[]\n     *\u002F\n    private $flyweights = [];\n\n    public function __construct(array $initialFlyweights)\n    {\n        foreach ($initialFlyweights as $state) {\n            $this->flyweights[$this->getKey($state)] = new Flyweight($state);\n        }\n    }\n\n    \u002F**\n     * Returns a Flyweight's string hash for a given state.\n     *\u002F\n    private function getKey(array $state): string\n    {\n        ksort($state);\n\n        return implode(\"_\", $state);\n    }\n\n    \u002F**\n     * Returns an existing Flyweight with a given state or creates a new one.\n     *\u002F\n    public function getFlyweight(array $sharedState): Flyweight\n    {\n        $key = $this->getKey($sharedState);\n\n        if (!isset($this->flyweights[$key])) {\n            echo \"FlyweightFactory: Can't find a flyweight, creating new one.\\n\";\n            $this->flyweights[$key] = new Flyweight($sharedState);\n        } else {\n            echo \"FlyweightFactory: Reusing existing flyweight.\\n\";\n        }\n\n        return $this->flyweights[$key];\n    }\n\n    public function listFlyweights(): void\n    {\n        $count = count($this->flyweights);\n        echo \"\\nFlyweightFactory: I have $count flyweights:\\n\";\n        foreach ($this->flyweights as $key => $flyweight) {\n            echo $key . \"\\n\";\n        }\n    }\n}\n\n\u002F**\n * The client code usually creates a bunch of pre-populated flyweights in the\n * initialization stage of the application.\n *\u002F\n$factory = new FlyweightFactory([\n    [\"Chevrolet\", \"Camaro2018\", \"pink\"],\n    [\"Mercedes Benz\", \"C300\", \"black\"],\n    [\"Mercedes Benz\", \"C500\", \"red\"],\n    [\"BMW\", \"M5\", \"red\"],\n    [\"BMW\", \"X6\", \"white\"],\n    \u002F\u002F ...\n]);\n$factory->listFlyweights();\n\n\u002F\u002F ...\n\nfunction addCarToPoliceDatabase(\n    FlyweightFactory $ff, $plates, $owner,\n    $brand, $model, $color\n) {\n    echo \"\\nClient: Adding a car to database.\\n\";\n    $flyweight = $ff->getFlyweight([$brand, $model, $color]);\n\n    \u002F\u002F The client code either stores or calculates extrinsic state and passes it\n    \u002F\u002F to the flyweight's methods.\n    $flyweight->operation([$plates, $owner]);\n}\n\naddCarToPoliceDatabase($factory,\n    \"CL234IR\",\n    \"James Doe\",\n    \"BMW\",\n    \"M5\",\n    \"red\",\n);\n\naddCarToPoliceDatabase($factory,\n    \"CL234IR\",\n    \"James Doe\",\n    \"BMW\",\n    \"X1\",\n    \"red\",\n);\n\n$factory->listFlyweights();\n","php","",[121,380,381,389,396,402,407,413,419,425,431,437,443,449,455,461,466,472,478,484,490,495,501,506,512,518,524,529,535,540,545,551,557,563,569,574,580,585,591,597,603,609,614,620,625,631,637,643,648,653,658,664,669,675,680,686,691,697,702,707,712,718,723,729,734,740,745,751,757,763,769,775,780,785,791,796,801,807,812,818,824,830,836,841,846,851,856,861,867,873,878,884,890,896,902,908,914,920,926,932,937,943,948,954,960,966,972,978,984,989,995,1001,1007,1012,1017,1023,1029,1035,1041,1047,1053,1059,1064,1069,1074,1079,1084,1090,1095,1100,1105],{"__ignoreMap":378},[382,383,386],"span",{"class":384,"line":385},"line",1,[382,387,388],{},"\u003C?php\n",[382,390,392],{"class":384,"line":391},2,[382,393,395],{"emptyLinePlaceholder":394},true,"\n",[382,397,399],{"class":384,"line":398},3,[382,400,401],{},"namespace RefactoringGuru\\Flyweight\\Conceptual;\n",[382,403,405],{"class":384,"line":404},4,[382,406,395],{"emptyLinePlaceholder":394},[382,408,410],{"class":384,"line":409},5,[382,411,412],{},"\u002F**\n",[382,414,416],{"class":384,"line":415},6,[382,417,418],{}," * The Flyweight stores a common portion of the state (also called intrinsic\n",[382,420,422],{"class":384,"line":421},7,[382,423,424],{}," * state) that belongs to multiple real business entities. The Flyweight accepts\n",[382,426,428],{"class":384,"line":427},8,[382,429,430],{}," * the rest of the state (extrinsic state, unique for each entity) via its\n",[382,432,434],{"class":384,"line":433},9,[382,435,436],{}," * method parameters.\n",[382,438,440],{"class":384,"line":439},10,[382,441,442],{}," *\u002F\n",[382,444,446],{"class":384,"line":445},11,[382,447,448],{},"class Flyweight\n",[382,450,452],{"class":384,"line":451},12,[382,453,454],{},"{\n",[382,456,458],{"class":384,"line":457},13,[382,459,460],{},"    private $sharedState;\n",[382,462,464],{"class":384,"line":463},14,[382,465,395],{"emptyLinePlaceholder":394},[382,467,469],{"class":384,"line":468},15,[382,470,471],{},"    public function __construct($sharedState)\n",[382,473,475],{"class":384,"line":474},16,[382,476,477],{},"    {\n",[382,479,481],{"class":384,"line":480},17,[382,482,483],{},"        $this->sharedState = $sharedState;\n",[382,485,487],{"class":384,"line":486},18,[382,488,489],{},"    }\n",[382,491,493],{"class":384,"line":492},19,[382,494,395],{"emptyLinePlaceholder":394},[382,496,498],{"class":384,"line":497},20,[382,499,500],{},"    public function operation($uniqueState): void\n",[382,502,504],{"class":384,"line":503},21,[382,505,477],{},[382,507,509],{"class":384,"line":508},22,[382,510,511],{},"        $s = json_encode($this->sharedState);\n",[382,513,515],{"class":384,"line":514},23,[382,516,517],{},"        $u = json_encode($uniqueState);\n",[382,519,521],{"class":384,"line":520},24,[382,522,523],{},"        echo \"Flyweight: Displaying shared ($s) and unique ($u) state.\\n\";\n",[382,525,527],{"class":384,"line":526},25,[382,528,489],{},[382,530,532],{"class":384,"line":531},26,[382,533,534],{},"}\n",[382,536,538],{"class":384,"line":537},27,[382,539,395],{"emptyLinePlaceholder":394},[382,541,543],{"class":384,"line":542},28,[382,544,412],{},[382,546,548],{"class":384,"line":547},29,[382,549,550],{}," * The Flyweight Factory creates and manages the Flyweight objects. It ensures\n",[382,552,554],{"class":384,"line":553},30,[382,555,556],{}," * that flyweights are shared correctly. When the client requests a flyweight,\n",[382,558,560],{"class":384,"line":559},31,[382,561,562],{}," * the factory either returns an existing instance or creates a new one, if it\n",[382,564,566],{"class":384,"line":565},32,[382,567,568],{}," * doesn't exist yet.\n",[382,570,572],{"class":384,"line":571},33,[382,573,442],{},[382,575,577],{"class":384,"line":576},34,[382,578,579],{},"class FlyweightFactory\n",[382,581,583],{"class":384,"line":582},35,[382,584,454],{},[382,586,588],{"class":384,"line":587},36,[382,589,590],{},"    \u002F**\n",[382,592,594],{"class":384,"line":593},37,[382,595,596],{},"     * @var Flyweight[]\n",[382,598,600],{"class":384,"line":599},38,[382,601,602],{},"     *\u002F\n",[382,604,606],{"class":384,"line":605},39,[382,607,608],{},"    private $flyweights = [];\n",[382,610,612],{"class":384,"line":611},40,[382,613,395],{"emptyLinePlaceholder":394},[382,615,617],{"class":384,"line":616},41,[382,618,619],{},"    public function __construct(array $initialFlyweights)\n",[382,621,623],{"class":384,"line":622},42,[382,624,477],{},[382,626,628],{"class":384,"line":627},43,[382,629,630],{},"        foreach ($initialFlyweights as $state) {\n",[382,632,634],{"class":384,"line":633},44,[382,635,636],{},"            $this->flyweights[$this->getKey($state)] = new Flyweight($state);\n",[382,638,640],{"class":384,"line":639},45,[382,641,642],{},"        }\n",[382,644,646],{"class":384,"line":645},46,[382,647,489],{},[382,649,651],{"class":384,"line":650},47,[382,652,395],{"emptyLinePlaceholder":394},[382,654,656],{"class":384,"line":655},48,[382,657,590],{},[382,659,661],{"class":384,"line":660},49,[382,662,663],{},"     * Returns a Flyweight's string hash for a given state.\n",[382,665,667],{"class":384,"line":666},50,[382,668,602],{},[382,670,672],{"class":384,"line":671},51,[382,673,674],{},"    private function getKey(array $state): string\n",[382,676,678],{"class":384,"line":677},52,[382,679,477],{},[382,681,683],{"class":384,"line":682},53,[382,684,685],{},"        ksort($state);\n",[382,687,689],{"class":384,"line":688},54,[382,690,395],{"emptyLinePlaceholder":394},[382,692,694],{"class":384,"line":693},55,[382,695,696],{},"        return implode(\"_\", $state);\n",[382,698,700],{"class":384,"line":699},56,[382,701,489],{},[382,703,705],{"class":384,"line":704},57,[382,706,395],{"emptyLinePlaceholder":394},[382,708,710],{"class":384,"line":709},58,[382,711,590],{},[382,713,715],{"class":384,"line":714},59,[382,716,717],{},"     * Returns an existing Flyweight with a given state or creates a new one.\n",[382,719,721],{"class":384,"line":720},60,[382,722,602],{},[382,724,726],{"class":384,"line":725},61,[382,727,728],{},"    public function getFlyweight(array $sharedState): Flyweight\n",[382,730,732],{"class":384,"line":731},62,[382,733,477],{},[382,735,737],{"class":384,"line":736},63,[382,738,739],{},"        $key = $this->getKey($sharedState);\n",[382,741,743],{"class":384,"line":742},64,[382,744,395],{"emptyLinePlaceholder":394},[382,746,748],{"class":384,"line":747},65,[382,749,750],{},"        if (!isset($this->flyweights[$key])) {\n",[382,752,754],{"class":384,"line":753},66,[382,755,756],{},"            echo \"FlyweightFactory: Can't find a flyweight, creating new one.\\n\";\n",[382,758,760],{"class":384,"line":759},67,[382,761,762],{},"            $this->flyweights[$key] = new Flyweight($sharedState);\n",[382,764,766],{"class":384,"line":765},68,[382,767,768],{},"        } else {\n",[382,770,772],{"class":384,"line":771},69,[382,773,774],{},"            echo \"FlyweightFactory: Reusing existing flyweight.\\n\";\n",[382,776,778],{"class":384,"line":777},70,[382,779,642],{},[382,781,783],{"class":384,"line":782},71,[382,784,395],{"emptyLinePlaceholder":394},[382,786,788],{"class":384,"line":787},72,[382,789,790],{},"        return $this->flyweights[$key];\n",[382,792,794],{"class":384,"line":793},73,[382,795,489],{},[382,797,799],{"class":384,"line":798},74,[382,800,395],{"emptyLinePlaceholder":394},[382,802,804],{"class":384,"line":803},75,[382,805,806],{},"    public function listFlyweights(): void\n",[382,808,810],{"class":384,"line":809},76,[382,811,477],{},[382,813,815],{"class":384,"line":814},77,[382,816,817],{},"        $count = count($this->flyweights);\n",[382,819,821],{"class":384,"line":820},78,[382,822,823],{},"        echo \"\\nFlyweightFactory: I have $count flyweights:\\n\";\n",[382,825,827],{"class":384,"line":826},79,[382,828,829],{},"        foreach ($this->flyweights as $key => $flyweight) {\n",[382,831,833],{"class":384,"line":832},80,[382,834,835],{},"            echo $key . \"\\n\";\n",[382,837,839],{"class":384,"line":838},81,[382,840,642],{},[382,842,844],{"class":384,"line":843},82,[382,845,489],{},[382,847,849],{"class":384,"line":848},83,[382,850,534],{},[382,852,854],{"class":384,"line":853},84,[382,855,395],{"emptyLinePlaceholder":394},[382,857,859],{"class":384,"line":858},85,[382,860,412],{},[382,862,864],{"class":384,"line":863},86,[382,865,866],{}," * The client code usually creates a bunch of pre-populated flyweights in the\n",[382,868,870],{"class":384,"line":869},87,[382,871,872],{}," * initialization stage of the application.\n",[382,874,876],{"class":384,"line":875},88,[382,877,442],{},[382,879,881],{"class":384,"line":880},89,[382,882,883],{},"$factory = new FlyweightFactory([\n",[382,885,887],{"class":384,"line":886},90,[382,888,889],{},"    [\"Chevrolet\", \"Camaro2018\", \"pink\"],\n",[382,891,893],{"class":384,"line":892},91,[382,894,895],{},"    [\"Mercedes Benz\", \"C300\", \"black\"],\n",[382,897,899],{"class":384,"line":898},92,[382,900,901],{},"    [\"Mercedes Benz\", \"C500\", \"red\"],\n",[382,903,905],{"class":384,"line":904},93,[382,906,907],{},"    [\"BMW\", \"M5\", \"red\"],\n",[382,909,911],{"class":384,"line":910},94,[382,912,913],{},"    [\"BMW\", \"X6\", \"white\"],\n",[382,915,917],{"class":384,"line":916},95,[382,918,919],{},"    \u002F\u002F ...\n",[382,921,923],{"class":384,"line":922},96,[382,924,925],{},"]);\n",[382,927,929],{"class":384,"line":928},97,[382,930,931],{},"$factory->listFlyweights();\n",[382,933,935],{"class":384,"line":934},98,[382,936,395],{"emptyLinePlaceholder":394},[382,938,940],{"class":384,"line":939},99,[382,941,942],{},"\u002F\u002F ...\n",[382,944,946],{"class":384,"line":945},100,[382,947,395],{"emptyLinePlaceholder":394},[382,949,951],{"class":384,"line":950},101,[382,952,953],{},"function addCarToPoliceDatabase(\n",[382,955,957],{"class":384,"line":956},102,[382,958,959],{},"    FlyweightFactory $ff, $plates, $owner,\n",[382,961,963],{"class":384,"line":962},103,[382,964,965],{},"    $brand, $model, $color\n",[382,967,969],{"class":384,"line":968},104,[382,970,971],{},") {\n",[382,973,975],{"class":384,"line":974},105,[382,976,977],{},"    echo \"\\nClient: Adding a car to database.\\n\";\n",[382,979,981],{"class":384,"line":980},106,[382,982,983],{},"    $flyweight = $ff->getFlyweight([$brand, $model, $color]);\n",[382,985,987],{"class":384,"line":986},107,[382,988,395],{"emptyLinePlaceholder":394},[382,990,992],{"class":384,"line":991},108,[382,993,994],{},"    \u002F\u002F The client code either stores or calculates extrinsic state and passes it\n",[382,996,998],{"class":384,"line":997},109,[382,999,1000],{},"    \u002F\u002F to the flyweight's methods.\n",[382,1002,1004],{"class":384,"line":1003},110,[382,1005,1006],{},"    $flyweight->operation([$plates, $owner]);\n",[382,1008,1010],{"class":384,"line":1009},111,[382,1011,534],{},[382,1013,1015],{"class":384,"line":1014},112,[382,1016,395],{"emptyLinePlaceholder":394},[382,1018,1020],{"class":384,"line":1019},113,[382,1021,1022],{},"addCarToPoliceDatabase($factory,\n",[382,1024,1026],{"class":384,"line":1025},114,[382,1027,1028],{},"    \"CL234IR\",\n",[382,1030,1032],{"class":384,"line":1031},115,[382,1033,1034],{},"    \"James Doe\",\n",[382,1036,1038],{"class":384,"line":1037},116,[382,1039,1040],{},"    \"BMW\",\n",[382,1042,1044],{"class":384,"line":1043},117,[382,1045,1046],{},"    \"M5\",\n",[382,1048,1050],{"class":384,"line":1049},118,[382,1051,1052],{},"    \"red\",\n",[382,1054,1056],{"class":384,"line":1055},119,[382,1057,1058],{},");\n",[382,1060,1062],{"class":384,"line":1061},120,[382,1063,395],{"emptyLinePlaceholder":394},[382,1065,1067],{"class":384,"line":1066},121,[382,1068,1022],{},[382,1070,1072],{"class":384,"line":1071},122,[382,1073,1028],{},[382,1075,1077],{"class":384,"line":1076},123,[382,1078,1034],{},[382,1080,1082],{"class":384,"line":1081},124,[382,1083,1040],{},[382,1085,1087],{"class":384,"line":1086},125,[382,1088,1089],{},"    \"X1\",\n",[382,1091,1093],{"class":384,"line":1092},126,[382,1094,1052],{},[382,1096,1098],{"class":384,"line":1097},127,[382,1099,1058],{},[382,1101,1103],{"class":384,"line":1102},128,[382,1104,395],{"emptyLinePlaceholder":394},[382,1106,1108],{"class":384,"line":1107},129,[382,1109,931],{},[162,1111,1113],{"id":1112},"örnek-python-kodu","Örnek Python Kodu",[373,1115,1119],{"className":1116,"code":1117,"language":1118,"meta":378,"style":378},"language-python shiki shiki-themes github-light github-dark","import json\nfrom typing import Dict\n\nclass Flyweight():\n    \"\"\"\n    The Flyweight stores a common portion of the state (also called intrinsic\n    state) that belongs to multiple real business entities. The Flyweight\n    accepts the rest of the state (extrinsic state, unique for each entity) via\n    its method parameters.\n    \"\"\"\n\n    def __init__(self, shared_state: str) -> None:\n        self._shared_state = shared_state\n\n    def operation(self, unique_state: str) -> None:\n        s = json.dumps(self._shared_state)\n        u = json.dumps(unique_state)\n        print(f\"Flyweight: Displaying shared ({s}) and unique ({u}) state.\", end=\"\")\n\nclass FlyweightFactory():\n    \"\"\"\n    The Flyweight Factory creates and manages the Flyweight objects. It ensures\n    that flyweights are shared correctly. When the client requests a flyweight,\n    the factory either returns an existing instance or creates a new one, if it\n    doesn't exist yet.\n    \"\"\"\n\n    _flyweights: Dict[str, Flyweight] = {}\n\n    def __init__(self, initial_flyweights: Dict) -> None:\n        for state in initial_flyweights:\n            self._flyweights[self.get_key(state)] = Flyweight(state)\n\n    def get_key(self, state: Dict) -> str:\n        \"\"\"\n        Returns a Flyweight's string hash for a given state.\n        \"\"\"\n\n        return \"_\".join(sorted(state))\n\n    def get_flyweight(self, shared_state: Dict) -> Flyweight:\n        \"\"\"\n        Returns an existing Flyweight with a given state or creates a new one.\n        \"\"\"\n\n        key = self.get_key(shared_state)\n\n        if not self._flyweights.get(key):\n            print(\"FlyweightFactory: Can't find a flyweight, creating new one.\")\n            self._flyweights[key] = Flyweight(shared_state)\n        else:\n            print(\"FlyweightFactory: Reusing existing flyweight.\")\n\n        return self._flyweights[key]\n\n    def list_flyweights(self) -> None:\n        count = len(self._flyweights)\n        print(f\"FlyweightFactory: I have {count} flyweights:\")\n        print(\"\\n\".join(map(str, self._flyweights.keys())), end=\"\")\n\ndef add_car_to_police_database(\n    factory: FlyweightFactory, plates: str, owner: str,\n    brand: str, model: str, color: str\n) -> None:\n    print(\"\\n\\nClient: Adding a car to database.\")\n    flyweight = factory.get_flyweight([brand, model, color])\n    # The client code either stores or calculates extrinsic state and passes it\n    # to the flyweight's methods.\n    flyweight.operation([plates, owner])\n\nif __name__ == \"__main__\":\n    \"\"\"\n    The client code usually creates a bunch of pre-populated flyweights in the\n    initialization stage of the application.\n    \"\"\"\n\n    factory = FlyweightFactory([\n        [\"Chevrolet\", \"Camaro2018\", \"pink\"],\n        [\"Mercedes Benz\", \"C300\", \"black\"],\n        [\"Mercedes Benz\", \"C500\", \"red\"],\n        [\"BMW\", \"M5\", \"red\"],\n        [\"BMW\", \"X6\", \"white\"],\n    ])\n\n    factory.list_flyweights()\n\n    add_car_to_police_database(\n        factory, \"CL234IR\", \"James Doe\", \"BMW\", \"M5\", \"red\")\n\n    add_car_to_police_database(\n        factory, \"CL234IR\", \"James Doe\", \"BMW\", \"X1\", \"red\")\n\n    print(\"\\n\")\n\n    factory.list_flyweights()\n","python",[121,1120,1121,1126,1131,1135,1140,1145,1150,1155,1160,1165,1169,1173,1178,1183,1187,1192,1197,1202,1207,1211,1216,1220,1225,1230,1235,1240,1244,1248,1253,1257,1262,1267,1272,1276,1281,1286,1291,1295,1299,1304,1308,1313,1317,1322,1326,1330,1335,1339,1344,1349,1354,1359,1364,1368,1373,1377,1382,1387,1392,1397,1401,1406,1411,1416,1421,1426,1431,1436,1441,1446,1450,1455,1459,1464,1469,1473,1477,1482,1487,1492,1497,1502,1507,1512,1516,1521,1525,1530,1535,1539,1543,1548,1552,1557,1561],{"__ignoreMap":378},[382,1122,1123],{"class":384,"line":385},[382,1124,1125],{},"import json\n",[382,1127,1128],{"class":384,"line":391},[382,1129,1130],{},"from typing import Dict\n",[382,1132,1133],{"class":384,"line":398},[382,1134,395],{"emptyLinePlaceholder":394},[382,1136,1137],{"class":384,"line":404},[382,1138,1139],{},"class Flyweight():\n",[382,1141,1142],{"class":384,"line":409},[382,1143,1144],{},"    \"\"\"\n",[382,1146,1147],{"class":384,"line":415},[382,1148,1149],{},"    The Flyweight stores a common portion of the state (also called intrinsic\n",[382,1151,1152],{"class":384,"line":421},[382,1153,1154],{},"    state) that belongs to multiple real business entities. The Flyweight\n",[382,1156,1157],{"class":384,"line":427},[382,1158,1159],{},"    accepts the rest of the state (extrinsic state, unique for each entity) via\n",[382,1161,1162],{"class":384,"line":433},[382,1163,1164],{},"    its method parameters.\n",[382,1166,1167],{"class":384,"line":439},[382,1168,1144],{},[382,1170,1171],{"class":384,"line":445},[382,1172,395],{"emptyLinePlaceholder":394},[382,1174,1175],{"class":384,"line":451},[382,1176,1177],{},"    def __init__(self, shared_state: str) -> None:\n",[382,1179,1180],{"class":384,"line":457},[382,1181,1182],{},"        self._shared_state = shared_state\n",[382,1184,1185],{"class":384,"line":463},[382,1186,395],{"emptyLinePlaceholder":394},[382,1188,1189],{"class":384,"line":468},[382,1190,1191],{},"    def operation(self, unique_state: str) -> None:\n",[382,1193,1194],{"class":384,"line":474},[382,1195,1196],{},"        s = json.dumps(self._shared_state)\n",[382,1198,1199],{"class":384,"line":480},[382,1200,1201],{},"        u = json.dumps(unique_state)\n",[382,1203,1204],{"class":384,"line":486},[382,1205,1206],{},"        print(f\"Flyweight: Displaying shared ({s}) and unique ({u}) state.\", end=\"\")\n",[382,1208,1209],{"class":384,"line":492},[382,1210,395],{"emptyLinePlaceholder":394},[382,1212,1213],{"class":384,"line":497},[382,1214,1215],{},"class FlyweightFactory():\n",[382,1217,1218],{"class":384,"line":503},[382,1219,1144],{},[382,1221,1222],{"class":384,"line":508},[382,1223,1224],{},"    The Flyweight Factory creates and manages the Flyweight objects. It ensures\n",[382,1226,1227],{"class":384,"line":514},[382,1228,1229],{},"    that flyweights are shared correctly. When the client requests a flyweight,\n",[382,1231,1232],{"class":384,"line":520},[382,1233,1234],{},"    the factory either returns an existing instance or creates a new one, if it\n",[382,1236,1237],{"class":384,"line":526},[382,1238,1239],{},"    doesn't exist yet.\n",[382,1241,1242],{"class":384,"line":531},[382,1243,1144],{},[382,1245,1246],{"class":384,"line":537},[382,1247,395],{"emptyLinePlaceholder":394},[382,1249,1250],{"class":384,"line":542},[382,1251,1252],{},"    _flyweights: Dict[str, Flyweight] = {}\n",[382,1254,1255],{"class":384,"line":547},[382,1256,395],{"emptyLinePlaceholder":394},[382,1258,1259],{"class":384,"line":553},[382,1260,1261],{},"    def __init__(self, initial_flyweights: Dict) -> None:\n",[382,1263,1264],{"class":384,"line":559},[382,1265,1266],{},"        for state in initial_flyweights:\n",[382,1268,1269],{"class":384,"line":565},[382,1270,1271],{},"            self._flyweights[self.get_key(state)] = Flyweight(state)\n",[382,1273,1274],{"class":384,"line":571},[382,1275,395],{"emptyLinePlaceholder":394},[382,1277,1278],{"class":384,"line":576},[382,1279,1280],{},"    def get_key(self, state: Dict) -> str:\n",[382,1282,1283],{"class":384,"line":582},[382,1284,1285],{},"        \"\"\"\n",[382,1287,1288],{"class":384,"line":587},[382,1289,1290],{},"        Returns a Flyweight's string hash for a given state.\n",[382,1292,1293],{"class":384,"line":593},[382,1294,1285],{},[382,1296,1297],{"class":384,"line":599},[382,1298,395],{"emptyLinePlaceholder":394},[382,1300,1301],{"class":384,"line":605},[382,1302,1303],{},"        return \"_\".join(sorted(state))\n",[382,1305,1306],{"class":384,"line":611},[382,1307,395],{"emptyLinePlaceholder":394},[382,1309,1310],{"class":384,"line":616},[382,1311,1312],{},"    def get_flyweight(self, shared_state: Dict) -> Flyweight:\n",[382,1314,1315],{"class":384,"line":622},[382,1316,1285],{},[382,1318,1319],{"class":384,"line":627},[382,1320,1321],{},"        Returns an existing Flyweight with a given state or creates a new one.\n",[382,1323,1324],{"class":384,"line":633},[382,1325,1285],{},[382,1327,1328],{"class":384,"line":639},[382,1329,395],{"emptyLinePlaceholder":394},[382,1331,1332],{"class":384,"line":645},[382,1333,1334],{},"        key = self.get_key(shared_state)\n",[382,1336,1337],{"class":384,"line":650},[382,1338,395],{"emptyLinePlaceholder":394},[382,1340,1341],{"class":384,"line":655},[382,1342,1343],{},"        if not self._flyweights.get(key):\n",[382,1345,1346],{"class":384,"line":660},[382,1347,1348],{},"            print(\"FlyweightFactory: Can't find a flyweight, creating new one.\")\n",[382,1350,1351],{"class":384,"line":666},[382,1352,1353],{},"            self._flyweights[key] = Flyweight(shared_state)\n",[382,1355,1356],{"class":384,"line":671},[382,1357,1358],{},"        else:\n",[382,1360,1361],{"class":384,"line":677},[382,1362,1363],{},"            print(\"FlyweightFactory: Reusing existing flyweight.\")\n",[382,1365,1366],{"class":384,"line":682},[382,1367,395],{"emptyLinePlaceholder":394},[382,1369,1370],{"class":384,"line":688},[382,1371,1372],{},"        return self._flyweights[key]\n",[382,1374,1375],{"class":384,"line":693},[382,1376,395],{"emptyLinePlaceholder":394},[382,1378,1379],{"class":384,"line":699},[382,1380,1381],{},"    def list_flyweights(self) -> None:\n",[382,1383,1384],{"class":384,"line":704},[382,1385,1386],{},"        count = len(self._flyweights)\n",[382,1388,1389],{"class":384,"line":709},[382,1390,1391],{},"        print(f\"FlyweightFactory: I have {count} flyweights:\")\n",[382,1393,1394],{"class":384,"line":714},[382,1395,1396],{},"        print(\"\\n\".join(map(str, self._flyweights.keys())), end=\"\")\n",[382,1398,1399],{"class":384,"line":720},[382,1400,395],{"emptyLinePlaceholder":394},[382,1402,1403],{"class":384,"line":725},[382,1404,1405],{},"def add_car_to_police_database(\n",[382,1407,1408],{"class":384,"line":731},[382,1409,1410],{},"    factory: FlyweightFactory, plates: str, owner: str,\n",[382,1412,1413],{"class":384,"line":736},[382,1414,1415],{},"    brand: str, model: str, color: str\n",[382,1417,1418],{"class":384,"line":742},[382,1419,1420],{},") -> None:\n",[382,1422,1423],{"class":384,"line":747},[382,1424,1425],{},"    print(\"\\n\\nClient: Adding a car to database.\")\n",[382,1427,1428],{"class":384,"line":753},[382,1429,1430],{},"    flyweight = factory.get_flyweight([brand, model, color])\n",[382,1432,1433],{"class":384,"line":759},[382,1434,1435],{},"    # The client code either stores or calculates extrinsic state and passes it\n",[382,1437,1438],{"class":384,"line":765},[382,1439,1440],{},"    # to the flyweight's methods.\n",[382,1442,1443],{"class":384,"line":771},[382,1444,1445],{},"    flyweight.operation([plates, owner])\n",[382,1447,1448],{"class":384,"line":777},[382,1449,395],{"emptyLinePlaceholder":394},[382,1451,1452],{"class":384,"line":782},[382,1453,1454],{},"if __name__ == \"__main__\":\n",[382,1456,1457],{"class":384,"line":787},[382,1458,1144],{},[382,1460,1461],{"class":384,"line":793},[382,1462,1463],{},"    The client code usually creates a bunch of pre-populated flyweights in the\n",[382,1465,1466],{"class":384,"line":798},[382,1467,1468],{},"    initialization stage of the application.\n",[382,1470,1471],{"class":384,"line":803},[382,1472,1144],{},[382,1474,1475],{"class":384,"line":809},[382,1476,395],{"emptyLinePlaceholder":394},[382,1478,1479],{"class":384,"line":814},[382,1480,1481],{},"    factory = FlyweightFactory([\n",[382,1483,1484],{"class":384,"line":820},[382,1485,1486],{},"        [\"Chevrolet\", \"Camaro2018\", \"pink\"],\n",[382,1488,1489],{"class":384,"line":826},[382,1490,1491],{},"        [\"Mercedes Benz\", \"C300\", \"black\"],\n",[382,1493,1494],{"class":384,"line":832},[382,1495,1496],{},"        [\"Mercedes Benz\", \"C500\", \"red\"],\n",[382,1498,1499],{"class":384,"line":838},[382,1500,1501],{},"        [\"BMW\", \"M5\", \"red\"],\n",[382,1503,1504],{"class":384,"line":843},[382,1505,1506],{},"        [\"BMW\", \"X6\", \"white\"],\n",[382,1508,1509],{"class":384,"line":848},[382,1510,1511],{},"    ])\n",[382,1513,1514],{"class":384,"line":853},[382,1515,395],{"emptyLinePlaceholder":394},[382,1517,1518],{"class":384,"line":858},[382,1519,1520],{},"    factory.list_flyweights()\n",[382,1522,1523],{"class":384,"line":863},[382,1524,395],{"emptyLinePlaceholder":394},[382,1526,1527],{"class":384,"line":869},[382,1528,1529],{},"    add_car_to_police_database(\n",[382,1531,1532],{"class":384,"line":875},[382,1533,1534],{},"        factory, \"CL234IR\", \"James Doe\", \"BMW\", \"M5\", \"red\")\n",[382,1536,1537],{"class":384,"line":880},[382,1538,395],{"emptyLinePlaceholder":394},[382,1540,1541],{"class":384,"line":886},[382,1542,1529],{},[382,1544,1545],{"class":384,"line":892},[382,1546,1547],{},"        factory, \"CL234IR\", \"James Doe\", \"BMW\", \"X1\", \"red\")\n",[382,1549,1550],{"class":384,"line":898},[382,1551,395],{"emptyLinePlaceholder":394},[382,1553,1554],{"class":384,"line":904},[382,1555,1556],{},"    print(\"\\n\")\n",[382,1558,1559],{"class":384,"line":910},[382,1560,395],{"emptyLinePlaceholder":394},[382,1562,1563],{"class":384,"line":916},[382,1564,1520],{},[77,1566],{},[80,1568,1570],{"id":1569},"diğer-tasarım-kalıplarıdesign-patterns","Diğer Tasarım Kalıpları\u002FDesign Patterns",[14,1572,1573],{},[18,1574,1575],{},"Oluşumsal Kalıplar (Creational Patterns)",[14,1577,1578,1581,1582,1581,1586,1581,1590,1581,1594],{},[55,1579,1580],{"href":292},"Factory Method",",\n",[55,1583,1585],{"href":1584},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory",[55,1587,1589],{"href":1588},"\u002Ftr\u002Fbuilder-tasarim-deseni-nedir","Builder",[55,1591,1593],{"href":1592},"\u002Ftr\u002Fprototype-tasarim-deseni-nedir","Prototype",[55,1595,351],{"href":1596},"\u002Ftr\u002Fsingleton-tasarim-deseni-nedir",[14,1598,1599],{},[18,1600,1601],{},"Yapısal Kalıplar (Structural Patterns)",[14,1603,1604,1581,1608,1581,1612,1581,1615,1581,1619,1581,1622,1581,1625],{},[55,1605,1607],{"href":1606},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter",[55,1609,1611],{"href":1610},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge",[55,1613,332],{"href":1614},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir",[55,1616,1618],{"href":1617},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator",[55,1620,341],{"href":1621},"\u002Ftr\u002Ffacade-tasarim-deseni-nedir",[55,1623,88],{"href":1624},"\u002Ftr\u002Fflyweight-tasarim-deseni-nedir",[55,1626,1628],{"href":1627},"\u002Ftr\u002Fproxy-tasarim-deseni-nedir","Proxy",[14,1630,1631],{},[18,1632,1633],{},"Davranışsal Kalıplar (Behavioral Patterns)",[14,1635,1636,1581,1640,1581,1644,1581,1648,1581,1652,1581,1656,1581,1660,1581,1664,1581,1668,1581,1672],{},[55,1637,1639],{"href":1638},"\u002Ftr\u002Fchain-of-responsibility-deseni-nedir","Chain of Responsibility",[55,1641,1643],{"href":1642},"\u002Ftr\u002Fcommand-tasarim-deseni-nedir","Command",[55,1645,1647],{"href":1646},"\u002Ftr\u002Fiterator-tasarim-deseni-nedir","Iterator",[55,1649,1651],{"href":1650},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator",[55,1653,1655],{"href":1654},"\u002Ftr\u002Fmemento-tasarim-deseni-nedir","Memento",[55,1657,1659],{"href":1658},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer",[55,1661,1663],{"href":1662},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State",[55,1665,1667],{"href":1666},"\u002Ftr\u002Fstrategy-tasarim-deseni-nedir","Strategy",[55,1669,1671],{"href":1670},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method",[55,1673,1675],{"href":1674},"\u002Ftr\u002Fvisitor-tasarim-deseni-nedir","Visitor",[1677,1678,1679],"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":378,"searchDepth":391,"depth":391,"links":1681},[1682,1683,1684,1688,1689,1690,1691,1692,1696],{"id":82,"depth":391,"text":83},{"id":94,"depth":391,"text":95},{"id":116,"depth":391,"text":117,"children":1685},[1686,1687],{"id":164,"depth":398,"text":165},{"id":194,"depth":398,"text":195},{"id":276,"depth":391,"text":277},{"id":285,"depth":391,"text":286},{"id":299,"depth":391,"text":300},{"id":324,"depth":391,"text":325},{"id":366,"depth":391,"text":367,"children":1693},[1694,1695],{"id":370,"depth":398,"text":371},{"id":1112,"depth":398,"text":1113},{"id":1569,"depth":391,"text":1570},[1698],"technical",null,"2021-09-14","Flyweight tasarım deseninin amacı, bellek (RAM) optimizasyonu sağlamak için içsel ve dışsal durumların ayrıştırılması ve paylaşımı.",false,"md","\u002Fimages\u002Fposts\u002F2021\u002F09\u002Fflyweight-tasarim-deseni.avif",{},{"title":6,"description":1701},"flyweight-tasarim-deseni-nedir","tr\u002Fflyweight-tasarim-deseni-nedir",[1710,1711],"design-pattern","ipucu","bXhzvSOHZRA8x4_AydFExTwtRtMD0Yy3Y1GWwheLWYM",{"prev":1714,"next":1716,"others":1718,"lucky":1831,"readingTime":433},{"path":1627,"title":1715},"Proxy Tasarım Deseni Nedir?",{"path":1621,"title":1717},"Facade Tasarım Deseni Nedir?",[1719,1722,1725,1728,1731,1734,1737,1740,1742,1745,1748,1750,1752,1755,1757,1760,1763,1766,1769,1771,1774,1777,1780,1783,1786,1789,1792,1795,1798,1800,1803,1806,1809,1812,1814,1817,1820,1823,1825,1828],{"path":1720,"title":1721},"\u002Ftr\u002Fes14-nedir-ecmascript-2023-nedir","ES14 nedir? ECMAScript 2023 nedir?",{"path":1723,"title":1724},"\u002Ftr\u002Fphalcon-frameworkun-gelecegi","Phalcon Framework'ün Geleceği: Bir Devrin Sonu",{"path":1726,"title":1727},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1729,"title":1730},"\u002Ftr\u002Fes5-nedir","ES5 Nedir? JavaScript Geliştiricileri İçin Kılavuz",{"path":1732,"title":1733},"\u002Ftr\u002Frestful-api-bilesenleri","RESTful API Bileşenleri",{"path":1735,"title":1736},"\u002Ftr\u002Fopenlitespeed-ve-litespeed-enterprisei-reverse-proxy-olarak-kullanmak","OpenLiteSpeed ve LiteSpeed Enterprise Sunucularını Reverse Proxy Olarak Kullanmak",{"path":1738,"title":1739},"\u002Ftr\u002Fnostalji-ibibik-online","Nostalji: İbibik Online (1998'den Bir Web Macerası)",{"path":1588,"title":1741},"Builder Tasarım Deseni Nedir?",{"path":1743,"title":1744},"\u002Ftr\u002Frest-api-uri-yapisi-nasil-olmali","REST API URI Yapısı Nasıl Olmalı?",{"path":1746,"title":1747},"\u002Ftr\u002Fphp-generator-ve-iterator-farki","PHP'de Generator ve Iterator Arasındaki Temel Farklar",{"path":1638,"title":1749},"Chain of Responsibility Deseni Nedir?",{"path":1614,"title":1751},"Composite Tasarım Deseni Nedir?",{"path":1753,"title":1754},"\u002Ftr\u002Fdocker-ile-mongodb-kurulumu","Docker ile MongoDB Kurulumu",{"path":1658,"title":1756},"Observer Tasarım Deseni Nedir?",{"path":1758,"title":1759},"\u002Ftr\u002Fmerhabadunya","Merhaba Dünya",{"path":1761,"title":1762},"\u002Ftr\u002Fgoda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir","Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?",{"path":1764,"title":1765},"\u002Ftr\u002Fgo-programlama-dilinin-ozellikleri","Go Programlama Dilinin Özellikleri",{"path":1767,"title":1768},"\u002Ftr\u002Fdocker-nedir","Docker Nedir?",{"path":1642,"title":1770},"Command Tasarım Deseni Nedir?",{"path":1772,"title":1773},"\u002Ftr\u002Fwsl-2-kurulumu-6-kolay-adim","WSL 2 Kurulumu - 6 kolay adım",{"path":1775,"title":1776},"\u002Ftr\u002Fyeni-tema-honeywind","Yeni WordPress Temam Honeywind: Tailwind CSS ve Minimalizm",{"path":1778,"title":1779},"\u002Ftr\u002Fcodeserver-nedir-codeserver-nasil-kurulur","Code-Server Nedir? Bulutta VS Code Geliştirme Ortamı Kurulumu",{"path":1781,"title":1782},"\u002Ftr\u002Fes10-nedir-ecmascript-2019-nedir","ES10 Nedir? ECMAScript 2019 Nedir?",{"path":1784,"title":1785},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":1787,"title":1788},"\u002Ftr\u002Fdocker-ile-redis-kurulumu","Docker ile Redis Kurulumu",{"path":1790,"title":1791},"\u002Ftr\u002Fdigital-oceanda-vps-kurulumu","DigitalOcean'da VPS (Droplet) Kurulumu: Adım Adım Rehber",{"path":1793,"title":1794},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":1796,"title":1797},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":1666,"title":1799},"Strategy Tasarım Deseni Nedir?",{"path":1801,"title":1802},"\u002Ftr\u002Fprogralama-ipucu-yoda-gosterimi","Yoda Koşulları (Yoda Conditions) Nedir? Programlama İpucu",{"path":1804,"title":1805},"\u002Ftr\u002Fes8-nedir-ecmascript-2017-nedir","ES8 Nedir? ECMAScript 2017 Nedir?",{"path":1807,"title":1808},"\u002Ftr\u002Fes7-nedir-ecmascript-2016-nedir","ES7 Nedir? ECMAScript 2016 Nedir?",{"path":1810,"title":1811},"\u002Ftr\u002Frest-api-kimlik-dogrulama-nasil-yapilir","REST API Kimlik Doğrulama Nasıl Yapılır?",{"path":1592,"title":1813},"Prototype Tasarım Deseni Nedir?",{"path":1815,"title":1816},"\u002Ftr\u002Fwebpack-nedir","Webpack Nedir? Modern JavaScript Paketleyici Ekosistemi",{"path":1818,"title":1819},"\u002Ftr\u002Fgo-ile-websockets-websocket-upgrader-nedir","Go ile WebSockets: Upgrader Nedir?",{"path":1821,"title":1822},"\u002Ftr\u002Fecmascript-nedir-ecmascript-ne-degildir-bilinmesi-gerekenler","ECMAScript Nedir? Bilinmesi Gerekenler...",{"path":1662,"title":1824},"State Tasarım Deseni Nedir?",{"path":1826,"title":1827},"\u002Ftr\u002Fekran-filtresi-mavi-isik-filtresi-flux","Gözlere dost, mavi ışığa düşman ekran filtresi f.lux",{"path":1829,"title":1830},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?",{"path":1832,"title":1833},"\u002Ftr\u002Fes17-nedir-ecmascript-2026-nedir","ES17 nedir? ECMAScript 2026 nedir?",[1835,1838,1841,1843],{"path":1674,"title":1836,"date":1837},"Visitor Tasarım Deseni Nedir?","2021-10-09",{"path":1670,"title":1839,"date":1840},"Template Method Tasarım Deseni Nedir?","2021-10-08",{"path":1666,"title":1799,"date":1842},"2021-10-07",{"path":1662,"title":1824,"date":1844},"2021-10-06",[1846,1848,1852],{"path":1729,"title":1730,"date":1847},"2021-10-20",{"path":1849,"title":1850,"date":1851},"\u002Ftr\u002Flinuxda-golang-kurulumu","Linux'ta Golang Kurulumu","2021-09-28",{"path":1807,"title":1808,"date":1853},"2021-10-19",1782142007861]