{"id":20633007,"url":"https://github.com/yenilikci/design-patterns","last_synced_at":"2026-04-21T14:32:52.970Z","repository":{"id":117874008,"uuid":"371811462","full_name":"yenilikci/Design-Patterns","owner":"yenilikci","description":"Tasarım desenlerini öğrenme amacıyla not niteliği taşıması amacıyla oluşturduğum repo. Oluşturucu, davranışsal ve yapısal tasarım kalıplarını içerecektir.","archived":false,"fork":false,"pushed_at":"2021-06-11T18:26:41.000Z","size":32,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-17T07:31:45.465Z","etag":null,"topics":["behaviour-patterns","creational-design-patterns","design-patterns","structural-design-patterns"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yenilikci.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-05-28T20:26:50.000Z","updated_at":"2024-03-17T09:36:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"34ba1dbf-06cb-472c-92f8-35d3b99826c0","html_url":"https://github.com/yenilikci/Design-Patterns","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2FDesign-Patterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2FDesign-Patterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2FDesign-Patterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2FDesign-Patterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yenilikci","download_url":"https://codeload.github.com/yenilikci/Design-Patterns/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242619128,"owners_count":20159003,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["behaviour-patterns","creational-design-patterns","design-patterns","structural-design-patterns"],"created_at":"2024-11-16T14:18:12.148Z","updated_at":"2025-12-06T14:02:38.832Z","avatar_url":"https://github.com/yenilikci.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Design-Patterns (Tasarım Kalıpları)\n\nBirçok farklı durumda kullanılabilecek bir sorunun nasıl çözüleceğine dair açıklamalar ve şablonlardır yani genel sorunların çözümüdür.\n\n## Creational Design Patterns (Oluşturucu Tasarım Kalıpları)\n\nNesnenin oluşturulması ile ilgili tasarım kalıplarıdır.\n\n### Singleton Design Pattern\n- Singleton Desing Pattern bir Creational Design Patterndır. \n- Singleton'ın kelime anlamı tekil demektir.\n- İlgili nesneden bir tane oluşturulmak isteniyorsa Singleton Design Pattern kullanılabilir.\n- Sınıf nesnesinin somutlaştırılmasına gerek yoktur, bu static keyword ile sağlanır.\n\n#### Singleton Uygulama\n```java\nfor (int i = 0; i \u003c 10; i++) {\n    Singleton singleton = Singleton.getSingleton();\n}\n```\nSayı artmaya devam etse dahi kurucu bir kere oluşturulur.\n\nKullanılmasını beklemeden, sınıflar oluşturulurken yapılan bu yükleme işlemine **Eager Loading** denir.\nFakat bu kullanım tarzı daha sonrasında bazı problemlerin oluşmasına neden olabilir.\n\nEğer nesneyi ihtiyaç duyduğumuz anda oluşturursak ve o ilk nesneyi kullanmaya devam edersek buna **Lazy Loading** denir.\nNesneyi ihtiyaç duyulmasından kastımız yazdığımız getSingleton() metodunun çağırılması.\n\nBurada ilk önce tanımlanan nesnenin null olup olmadığı kontrol edilmeli eğer null ise nesne oluşturma işlemi gerçekleştirilmeli.\n\n```java\npublic class Singleton {\n\n\tprivate static Singleton singleton;\n\n\tprivate static int sayi = 0;\n\n\tprivate Singleton() {\n\t\tSystem.out.println(\"Ben oluştum\");\n\t}\n\n\tpublic static Singleton getSingleton() {\n\t\tif (singleton == null) {\n\t\t    singleton = new Singleton();\n\t\t}\n\t\tsayi++;\n\t\tSystem.out.println(sayi);\n\t\treturn singleton;\n\t}\n}\n```\nTek threadli ortam için bu işimizi görse de multi-threaded bir ortamda çalışılıyorsa ve aynı anda getSingleton() metodu çağırılıyorsa bir açığa sebebiyet vermiş oluruz.\nLazy Loading ile ortaya çıkabilecek bu açığı kapatalım.\n\n```java\nsynchronized (Singleton.class) {\n\tif (singleton == null) {\n\t\tsingleton = new Singleton();\n\t}\t\n}\n```\nŞu anda synchronized ile bu açığın önüne geçsekte metodun çalışmasını yavaşlattık. synchronized anahtar kelimesi ile karşılaşan yerlerde threadler kuyruğa girerler.\nBizler synchronized'a nesnenin ilk oluşumu esnasında ihtiyaç duyuyoruz. Bir if kontrolü daha ekleyerek singleton boş mu? (daha önce oluşturulmuş mu) kontrolünü sağlarsak synchronized'ın programı yorma sorununu da minimalize etmiş oluruz.\n\n```java\nif (singleton == null) {\n\tsynchronized (Singleton.class) {\n\t\tif (singleton == null) {\n\t\t\tsingleton = new Singleton();\n\t\t}\n\t}\n}\n```\nBu iki kere null kontrolünün sağlandığı tasarım kalıbına **Double Checked Locking** denir. Böylelikle hem **Lazy Loading** yapmış olduk hem de **Thread Safe** çalışmış olduk. \n\n### Factory Design Pattern\nBirbirine benzeyen sınıflar ile bir fabrika sınıf içerisinde nesne oluşturma çağrılarını gerçekleştirme mantığını esas alır.\n\nBir arayüz ile kullanacağımız sınıfları kümeleriz örn: **Telefon** arayüzü. Telefonlarımız da **S8** ve **Note8** olsun bunlar için birer sınıf oluşturacak olursak (benzerliği sağlamak için ve her ikiside birer telefon olduğu için) **Telefon** arayüzünü implemente ederiz. \n\nProgram içerisinde herhangi bir yerde new'lemek yerine ise **TelefonFabrikasi** sınıfında dönüş tipi arayüz ile aynı olan static bir fonksiyon içerisinde gelecek olan telefon tipine göre nesne çağrılarını gerçekleştiririz.\n\n```java\npublic class TelefonFabrikasi {\n\n\tpublic static Telefon getTelefon(String model, String batarya, int en, int boy) {\n\n\t\tTelefon telefon;\n\t\tif (\"S8\".equalsIgnoreCase(model)) {\n\t\t\ttelefon = new S8(model, batarya, en, boy);\n\t\t} else if (\"Note8\".contentEquals(model)) {\n\t\t\ttelefon = new Note8(model, batarya, en, boy);\n\t\t} else {\n\t\t\tthrow new RuntimeException(\"Gecerli bir model degildir\");\n\t\t}\n\t\treturn telefon;\n\n\t}\n\n}\n```\n\nBurada telefon tiplerine göre ayrı nesne çağrılarını gerçekleştirebilmek için if else yapılarından yararlandık, bu da ileride yeni sınıflar (telefonlar/telefon modelleri) eklendiğinde bir bağımlılık durumu ve karmaşaya sebep olacaktır.\n\n###  Abstract Factory Design Pattern\n\nFactory deseninde TelefonFabrikasi adında bir sınıf oluşturmuştuk. Model bilgisine göre S8 veya Note8 telefonlarını üretiyorduk. Fakat yüzlerce model olabileceği için yüzlerce if else yazıldığında kodun karmaşık bir hale geleceğinden bahsetmiştik.\n\nBiz bu tasarım deseninde telefon fabrikasını arayüz olarak tanımlayıp S8Fabrikasi ve Note8Fabrikası olmak üzere ayrı fabrikalara ayırırız. S8Fabrikası sadece S8, Note8Fabrikasi ise sadece Note8 üretir. Bayiler ise S8 istediğinde S8  fabrikasından, Note8 istediklerinde Note8 fabrikasından istek yaparlar. Böylelikle karmaşıklıktan arındırılmış olur.\n\n\n```java\npublic class TelefonBayi {\n\n\tpublic static void main(String[] args) {\n\n\t\tS8Fabrikasi s8Fabrikasi = new S8Fabrikasi();\n\t\tTelefon s8 = s8Fabrikasi.getTelefon(\"S8\", \"2600mah\", 4, 7);\n\n\t\tNote8Fabrikasi note8Fabrikasi = new Note8Fabrikasi();\n\t\tTelefon note8 = note8Fabrikasi.getTelefon(\"Note8\", \"3000mah\", 5, 8);\n\n\t\tSystem.out.println(s8);\n\t\tSystem.out.println(note8);\n\n\t}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyenilikci%2Fdesign-patterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyenilikci%2Fdesign-patterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyenilikci%2Fdesign-patterns/lists"}