Programlamada Tasarım Desenleri #1 — Singleton Design Pattern (C# .NET ile Örnekler)

Yazılım geliştirme dünyasında her zaman yeniden kullanılabilir ve sürdürülebilir kodlar yazmak hedeflenir. İşte bu noktada karşımıza çıkan “Tasarım Desenleri (Design Patterns)” yazılım mimarisinin temel yapıtaşlarından biridir. Bu yazı dizimizin ilk bölümünde en çok bilinen ve kullanılan tasarım desenlerinden biri olan Singleton Pattern’i ele alacağız. C# ve .NET üzerinden örneklerle anlatacağımız bu deseni, gerçek hayat senaryoları ile birlikte inceleyeceğiz.


Singleton Design Pattern Nedir?

Singleton Pattern, bir sınıfın yalnızca bir örneği (instance) olmasını sağlar ve bu örneğe tüm uygulama genelinden global olarak erişim imkanı sunar.

Kısaca:

  • Bir sınıfın tek bir nesnesinin oluşturulmasını garanti eder.
  • Bu nesneye global bir erişim noktası sağlar.

Bu desen özellikle:

  • Konfigürasyon yöneticileri
  • Kaynak paylaşımı (örneğin veri tabanı bağlantıları)
  • Log mekanizmaları gibi altyapı servislerinde sıkça kullanılır.

Neden Singleton?

Aşağıdaki gibi bir senaryo düşünün:

Bir uygulama içerisinde Logger (Günlükleyici) kullanıyorsunuz. Her log geldiğinde yeni bir Logger nesnesi oluşturursanız hem gereksiz kaynak tüketimi olur hem de yönetmesi zor bir yapıya yol açarsınız. İşte burada Singleton devreye girer ve uygulama boyunca tek bir Logger nesnesi olmasını sağlar.


C# (.NET) ile Singleton Pattern Nasıl Uygulanır?

1. Basit Singleton (Thread-Safe Olmayan)

public class SimpleSingleton {
private static SimpleSingleton _instance;

private SimpleSingleton() {
// private yapılmasının nedeni: dışarıdan new ile nesne oluşturulmasını engellemek
}

public static SimpleSingleton Instance {
get {
if (_instance == null)
_instance = new SimpleSingleton();
return _instance;
}
}
}

❗ Bu yöntem çoklu iş parçacığı (multi-threading) ortamlarında sorun yaratabilir. Aynı anda iki thread birden _instance == null durumunu yakalayıp 2 ayrı nesne oluşturabilir.


2. Thread Safe Singleton

public class ThreadSafeSingleton {
private static ThreadSafeSingleton _instance;
private static readonly object _lock = new object();

private ThreadSafeSingleton() {
}

public static ThreadSafeSingleton Instance {
get {
lock (_lock) {
if (_instance == null)
_instance = new ThreadSafeSingleton();
return _instance;
}
}
}
}

✅ Bu yapı ile her zaman tek bir nesne oluşturulur ve thread güvenliği sağlanmış olur.


3. Lazy Initialization (C# 4.0 ve sonrasında önerilen)

public class LazySingleton {
private static readonly Lazy _instance =
new Lazy(() => new LazySingleton());

private LazySingleton() {
}

public static LazySingleton Instance => _instance.Value;
}

👉 Bu yapı hem performanslıdır, hem de thread-safe olarak çalışır. Modern C# projelerinde sıkça tercih edilir.


Singleton Kullanım Senaryoları

1. Logger Sınıfı

public class Logger {
private static readonly Lazy _logger =
new Lazy(() => new Logger());

private Logger() {}

public static Logger Instance => _logger.Value;

public void Log(string message) {
Console.WriteLine($”[LOG – {DateTime.Now.ToLongTimeString()}]: {message}”);
}
}

// Kullanımı
Logger.Instance.Log(“Uygulama başlatıldı.”);


2. Konfigürasyon Yöneticisi

public class ConfigManager {
private static readonly Lazy _instance =
new Lazy(() => new ConfigManager());

private Dictionary<string, string> _settings;

private ConfigManager() {
// Simülasyon: Konfigürasyonlar yükleniyor
_settings = new Dictionary<string, string> {
{ “ApiUrl”, “https://api.deneme.com” },
{ “LogLevel”, “Error” }
};
}

public static ConfigManager Instance => _instance.Value;

public string GetSetting(string key) {
return _settings.ContainsKey(key) ? _settings[key] : null;
}
}

// Kullanımı
string apiUrl = ConfigManager.Instance.GetSetting(“ApiUrl”);


Singleton Kullanırken Dikkat Edilmesi Gerekenler

  • Singleton, gereksiz bağımlılık yaratabilir. Test yazarken bağımlılıkları izole etmek zorlaşabilir.
  • Farkına varmadan global değişken kullanımına dönüşebilir.
  • State (durum) tutuyorsa, thread güvenliği iyice düşünülmelidir.

Singleton’ın Alternatifleri

Dependency Injection (DI): Modern .NET core uygulamalarda çoğu zaman Singleton yerine DI Container ile singleton servisler tanımlanır.

Örneğin:

builder.Services.AddSingleton<ILoggerService, LoggerService>();

Bu yöntem ile test edilebilirlik ve esneklik artar.


Görsel Anlatım 📷

Singleton Pattern Şeması

Kaynak: refactoring.guru


SEO Dostu Özet 🎯

  • Singleton Design Pattern, yazılım mimarisinde sıkça kullanılan bir creational pattern’dir.
  • C# ve .NET ile Singleton örnekleri uygulayarak tasarım kalıplarını öğrenebilirsiniz.
  • Singleton kullanırken thread safety ve bağımlılık yönetimi önemlidir.
  • Modern .NET uygulamalarında Singleton yerine Dependency Injection tercih edilebilir.

Sonuç

Singleton Design Pattern, uygulamanızda merkezi kontrol sağladığınız servis ve yöneticiler için oldukça kullanışlıdır. Ancak, her güçlü araç gibi dikkatli kullanılmalıdır. Gereğinden fazla kullanıldığında kodunuzda sıkı bağımlılıklara yol açabilir. Bu nedenle kullanmadan önce ihtiyaçlarınızı iyi analiz etmenizi öneririz.

📌 Tasarım desenlerine giriş yaptığımız bu serinin devamında Factory, Observer, Strategy ve daha fazlasını detaylı biçimde ele alacağız. Takipte kalın!


Sık Sorulan Sorular (FAQ)

🔹 Singleton kullanmak kötü mü?
Hayır, amacına uygun kullanıldığında yararlıdır. Ancak her yerde kullanmak doğru değildir.

🔹 Dependency Injection ile Singleton çakışır mı?
Hayır. DI Container içindeki servislerin yaşam süreleri AddSingleton() ile belirtilebilir.

🔹 C#’ta Singleton’ı test etmek mümkün mü?
Evet; ancak test edilebilirliğini artırmak için örneği bağımlılık olarak enjekte edebilirsiniz.


📬 Yorumlarınızı ve sorularınızı bizimle paylaşın. Sizi dinlemek isteriz!

🔔 Bu yazıyı beğendiyseniz, lütfen paylaşmayı unutmayın ve blog bültenimize abone olun.


Etiketler:
#CSharp #DotNet #SingletonPattern #TasarımDesenleri #DesignPatterns #OOP #DependencyInjection #SoftwareArchitecture #Logger #CodingBestPractices

Singleton Pattern Infographic
Thread Safe Singleton Illustration
Lazy Initialization Singleton Code
Config Manager Singleton Flowchart

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir