Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
Cevap
Singleton, bir sınıfın uygulama boyunca tek bir örneği olmasını garanti eder ve ona global bir erişim noktası sağlar. Tipik örnekler: yapılandırma, logger, bağlantı havuzu.
Thread-safe uygulama (Java)
// Double-checked locking: volatile şart
public final class Config {
private static volatile Config instance;
private Config() { /* dosyadan yükle */ }
public static Config getInstance() {
if (instance == null) {
synchronized (Config.class) {
if (instance == null) {
instance = new Config();
}
}
}
return instance;
}
}
// Daha basit ve güvenli: enum singleton
public enum Registry {
INSTANCE;
public void register(String key) { ... }
}Kilitsiz ilk kontrolde iki thread aynı anda null görüp iki örnek oluşturabilir; bu yüzden senkronizasyon gerekir. volatile olmadan başka bir thread yarı kurulmuş nesneyi görebilir. Statik alan başlatma veya holder sınıfı deseni de JVM'in sınıf yükleme garantisiyle güvenlidir.
Neden anti-pattern sayılır?
- Gizli global durum: bağımlılık imzada görünmez, kod nereden ne değiştiğini anlamak zorlaşır.
- Test zorluğu: sahte (mock) bir örnekle değiştirmek zordur; testler arasında durum sızar.
- Single Responsibility ihlali: sınıf hem işini yapar hem kendi yaşam döngüsünü yönetir.
- Dağıtık sistemlerde "tek örnek" yalnızca bir süreç içinde geçerlidir.
Modern alternatif
Sınıfı normal yazın, DI container'da singleton ömrüyle kaydedin (Spring bean'leri varsayılan olarak böyledir). Böylece tek örnek garantisi korunur ama bağımlılık açıkça enjekte edilir ve testte değiştirilebilir.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Interface ile abstract class arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.