Singleton Design Pattern

Oguz Erdogan
3 min readAug 2, 2024

--

Yazılım tasarımında bazen bir sınıfın yalnızca bir örneğinin (instance) oluşturulmasını ve bu örneğin uygulama boyunca erişilebilir olmasını isteriz. Bu durumda Singleton Pattern devreye girer. Singleton Pattern, belirli bir sınıfın yalnızca bir örneğinin olmasını sağlar ve bu örneğe global bir erişim noktası sunar.

Singleton Pattern Nedir?

Singleton Pattern, bir sınıfın yalnızca bir örneğinin oluşturulmasını ve bu örneğin tüm uygulama boyunca kullanılmasını garanti eden bir tasarım desenidir. Bu pattern, genellikle küresel bir durumun yönetimi, konfigürasyon ayarlarının merkezi bir yerden erişimi veya bir kaynağın paylaşımı gibi durumlar için kullanılır.

Kullanım Senaryoları

Singleton Pattern, aşağıdaki durumlarda kullanılabilir:

  • Konfigürasyon Yönetimi: Uygulama ayarlarının merkezi bir yerden yönetilmesi ve erişilmesi gerektiğinde.
  • Kaynak Yönetimi: Veritabanı bağlantısı gibi paylaşılan kaynakların tek bir örnek üzerinden yönetilmesi gerektiğinde.
  • Loglama: Uygulama boyunca tek bir loglama nesnesi kullanarak log işlemlerinin yapılması gerektiğinde.

Singleton Pattern’in C# ile Uygulanması

Loglama İçin Singleton Pattern

Bu örnekte, bir loglama sınıfı oluşturacağız ve bu sınıfın yalnızca bir örneğinin oluşturulmasını sağlayacağız.

using System;
using System.IO;

namespace SingletonPatternExample.Singleton
{
public sealed class Logger
{
private static Logger instance = null;
private static readonly object padlock = new object();
private string logFilePath;

Logger()
{
logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.txt");
}

public static Logger Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Logger();
}
return instance;
}
}
}

public void Log(string message)
{
try
{
using (StreamWriter writer = new StreamWriter(logFilePath, true))
{
writer.WriteLine($"{DateTime.Now}: {message}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Failed to write to log file: {ex.Message}");
}
}
}
}

Bu kodda, Logger sınıfının tek bir örneği oluşturulur ve bu örneğe Instance özelliği üzerinden erişilir. Log metodu, verilen mesajı bir dosyaya yazar.

Kullanım Örneği

Program.cs

using System;
using SingletonPatternExample.Singleton;

namespace SingletonPatternExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"Current Directory: {AppDomain.CurrentDomain.BaseDirectory}");

Logger logger1 = Logger.Instance;
Logger logger2 = Logger.Instance;

if (logger1 == logger2)
{
Console.WriteLine("Both logger instances are the same.");
}

logger1.Log("Application started.");
logger2.Log("Application running.");
logger1.Log("Application finished.");
}
}
}

Bu örnekte, Logger sınıfının iki örneği oluşturulmaya çalışılır, ancak aslında aynı örneğe işaret ederler. Bu, Singleton Pattern'in amacını gösterir: tek bir örneğin var olmasını sağlamak.

Klasör Yapısının Özeti

SingletonPatternExample
│ SingletonPatternExample.csproj
│ Program.cs

└───Singleton
Logger.cs

Ayrıca, proje klasöründe bir log.txt dosyası oluşturulacak ve içinde şu log kayıtları bulunacaktır:

<timestamp>: Application started.
<timestamp>: Application running.
<timestamp>: Application finished.

Avantajlar ve Dezavantajlar

Avantajlar

  • Kontrollü Nesne Yaratımı: Tek bir örneğin yaratılması ve yönetilmesi.
  • Global Erişim: Uygulama boyunca aynı nesneye kolay erişim.
  • Kaynak Yönetimi: Paylaşılan kaynakların merkezi yönetimi.

Dezavantajlar

  • Test Edilebilirlik: Singleton sınıflarının test edilmesi zor olabilir.
  • Bağımlılıklar: Singletonlar, küresel durumlar yaratarak bağımlılıkları artırabilir.
  • Çoklu İş Parçacığı: Çoklu iş parçacığında dikkatli kullanılmazsa sorunlar yaşanabilir.

Gerçek Dünya Örnekleri

  • Veritabanı Bağlantısı: Çoğu uygulama, veritabanı bağlantısını yönetmek için Singleton Pattern kullanır.
  • Loglama: Tek bir loglama nesnesi kullanarak uygulama boyunca log işlemlerinin yapılması.

Sonuç

Singleton Pattern, bir sınıfın tek bir örneğinin oluşturulmasını ve bu örneğe global bir erişim sağlanmasını garanti eden güçlü bir tasarım desenidir. Bu pattern, konfigürasyon yönetimi, kaynak yönetimi ve loglama gibi durumlarda oldukça kullanışlıdır. Ancak, dikkatli kullanılmazsa test edilebilirlik ve bağımlılıklar gibi sorunlara yol açabilir.

--

--