Yazılımda En Sık Kullanılan Tasarım Kalıpları: Singleton, Factory ve Observer Rehberi
Tekerleği yeniden icat etmeden sürdürülebilir, esnek ve test edilebilir kod yazmanın kuralları: Gang of Four tasarım kalıplarından Singleton, Factory Method ve Observer kalıplarının mantığı, kullanım alanları ve kod örnekleri.
Bir yazılım projesine başlarken ilk birkaç hafta her şey harika gider. Ancak kod tabanı büyüdükçe yeni bir özellik eklemek diğer beş yeri bozar, aynı nesneler defalarca gereksiz yere üretilir ve sınıflar birbirine kördüğüm gibi bağlanır. Yazılım dünyasında karşılaşılan bu tipik mimari sorunlar yeni değildir; onlarca yıldır yüz binlerce mühendis tarafından tekrar tekrar yaşanmıştır. İşte bu kronik problemlere karşı geliştirilmiş, zamanın testinden geçmiş en zarif ve standartlaşmış mimari çözümlere 'Tasarım Kalıpları' (Design Patterns) denir. 1994 yılında 'Gang of Four' (GoF) tarafından kaleme alınan bu kalıplardan günlük hayatta en sık karşılaşacağınız üçünü mercek altına alıyoruz.
1. Singleton Kalıbı (Tekillik Deseni):
Amacı: Bir sınıfın tüm uygulama yaşam döngüsü boyunca yalnızca TEK bir örneğinin (instance) var olmasını garanti etmek ve bu örneğe global bir erişim noktası sağlamaktır.
Nerede Kullanılır?: Veritabanı bağlantı havuzları (Connection Pool), merkezi loglama mekanizmaları veya uygulama genelindeki konfigürasyon yöneticileri.
Python'da veya Kotlin'de Uygulanışı:
Kotlin'de 'object' anahtar kelimesi dili seviyesinde doğal ve thread-safe bir Singleton üretir (örneğin: object DatabaseManager { ... }). Python'da ise modül sistemi zaten doğal bir Singleton'dır ya da __new__ metodu ezilerek uygulanır.
DİKKAT (Anti-Pattern Uyarısı): Singleton'ı her yere serpiştirmek global değişken kullanmak gibidir. Birim testlerde (Unit Test) sahte nesnelerle (Mock) değiştirmeyi zorlaştırır ve gizli bağımlılıklar yaratır. Yalnızca durumu paylaşılması zorunlu sistem kaynaklarında kullanılmalıdır.
2. Factory Method Kalıbı (Fabrika Deseni):
Amacı: Nesne oluşturma mantığını (new anahtar kelimesiyle doğrudan sınıf çağırmayı) istemci koddan tamamen soyutlamak ve hangi somut alt sınıfın üretileceğini alt sınıflara veya bir fabrika metoduna bırakmaktır.
Neden İhtiyaç Duyulur?: Diyelim ki bir e-ticaret sisteminde bildirim göndereceksiniz. Başlangıçta sadece 'EmailNotification' sınıfı vardı. Yarın 'SmsNotification', öbür gün 'PushNotification' eklendiğinde projenin 50 farklı yerindeki 'if-else' bloklarını tek tek değiştirmek zorunda kalırsınız (Open/Closed prensibi ihlali).
Çözüm: Bir 'NotificationFactory' kurarsınız. İstemci sadece 'factory.create('SMS')' der. Hangi sınıfın nasıl üretileceğini fabrika bilir. Yeni bir bildirim türü geldiğinde yalnızca yeni bir sınıf yazar ve fabrikaya eklersiniz; ana kodlarınızın hiçbirine dokunmazsınız.
3. Observer Kalıbı (Gözlemci Deseni):
Amacı: Bir nesnede (Subject / Yayıncı) bir değişiklik olduğunda, ona abone olan tüm diğer nesnelerin (Observers / Dinleyiciler) otomatik olarak uyarılmasını ve güncellenmesini sağlayan bire-çok (one-to-many) bir bağımlılık mekanizmasıdır.
Nerede Kullanılır?: Olay odaklı (Event-Driven) mimariler, buton tıklama dinleyicileri (OnClickListener), hisse senedi fiyatı değiştiğinde ekrandaki grafik ve alarm kutularının aynı anda güncellenmesi veya haber bülteni abonelikleri.
Nasıl Çalışır?: Yayıncı sınıf içinde 'aboneEkle()', 'aboneCikar()' ve 'bildir()' metotları bulunur. Yayıncının durumu değiştiğinde kendi içindeki liste üzerinden döngüyle tüm abonelerin 'guncelle()' metodunu tetikler. Böylece yayıncı, abonelerin kim olduğunu veya ne iş yaptığını bilmek zorunda kalmaz (Loose Coupling - Gevşek Bağlılık).
Aşırı Mühendislik (Over-Engineering) Tuzağı:
Tasarım kalıplarını yeni öğrenen geliştiricilerin düştüğü en yaygın hata; kalıpları her küçük probleme zorla entegre etmeye çalışmaktır. İki satırlık basit bir işlem için üç katmanlı Factory ve Abstract Factory kurmak kodun okunabilirliğini öldürür. Tasarım kalıpları ezberlenip taklit edilecek dogmalar değil; karmaşıklık baş gösterdiğinde başvurulacak pratik bir alet çantasıdır.
Sonuç: Temiz ve Sürdürülebilir Mimari:
Singleton, Factory ve Observer; temiz kod (Clean Code) ve SOLID prensiplerinin somutlaşmış halleridir. Bu üç kalıbı yerinde ve amacına uygun kullandığınızda, takım arkadaşlarınızın rahatça okuyabildiği, kolayca test edilebilen ve yıllar sonra bile genişletilebilen kaya gibi sağlam sistemler inşa edersiniz.