C# Singleton (Tek) Class

Merhaba arkadaşlar,

Bu yazımda Singleton tasarım desenini ele alacağız. Bu desen hakkında bilgilenip hangi durumlarda, nerelerde kullanabileceğimizi örnek üzerinden anlamaya çalışacağız. Singleton tasarım desenine geçmeden önce sınıflar ve nesneler ile ilgili temel bilgilerimizi hatırlamak amacıyla yazıma buradan ulaşabilirsiniz.

Singleton deseni bir programın yaşamı boyunca belirli bir nesneden sadece bir örneğinin (instance) olmasını garantiler. Aynı zamanda bu desen yaratılan tek nesneye ilgili sınıf dışından global seviyede mutlaka erişebilmesini sağlar. Örneğin bir veritabanı uygulaması geliştirdiğimizi düşünürsek her programcı bu veritabanı uygulamasını kullanarak belli bir anda sadece bir bağlantı nesnesinin oluşmasını ister. Bu sayede her defasından yeni bir bağlantı nesnesi oluşmaktansa var olan ve oluşan bağlantı nesnesini kullanarak sistem kaynaklarını daha efektif kullanmasını sağlar.

O zaman program geliştirirken yukarıdaki örnek gibi ihtiyacımıza göre ilgili sınıfın sadece bir örneğine (instance) ihtiyaç duyarsak bu deseni kullanmalıyız. Bu deseni kullanmaya karar verdiğimizde ilgili nesnenin sadece ve sadece tek bir örneğinin oluşmasını sağlamak için static üye elemanlarından faydalanacağız.

Yukarıdaki örnekte DatabaseManager sınıfı farklı süreçlerde farklı nesnelerinin oluştuğunu düşünürsek ihtiyacımız olan singleton tasarım deseni bu sınıfımız için uygulayalım.

İşte şimdi DatabaseManager sınıfımızdan tek bir nesne oluşmasını sağlayacak yapıya geçtik. Bunun için sınıfımıza static özellikte DatabaseManager türünde bir özellik ekledik. Bu sayede DatabaseManager sınıfımızı kullanarak nesne oluşmasına gerek olmadan aslında DatabaseManager türünde bir nesnenin oluşmasını sağladık. Bu değişkeni global düzeyde erişebilmek için sadece get bloğu olan Instance adında bir özellik ekledik. Artık Instance özelliğini her kullandığımızda geri dönecek olan nesne sınıfın belleğe ilk yüklendiğinde yaratılan nesne olduğunu garanti altına almış olduk.

Bu tasarım desenini bir başka kullanım şeklide sınıfın belleğe yüklendiğinde değil de ancak biz istediğimiz anda o nesnenin oluşmasını sağlayabiliriz.

Yukarıdaki iki farklı versiyonda da bazı durumlar için tek bir nesnenin oluşmasını garanti etmemiş olabiliriz. Eğer çok kanallı (multi-thread) bir uygulama geliştiriyorsanız farklı kanalların aynı nesneyi oluşturması olasıdır. Bunun için ekstra kontrollerin yapılması gerekir.

Thread güvenli yeni nesne ve işlediğimiz yapıları kullanarak Singleton tasarım desenini tekrar ele alacak olursak

Yukarıdaki versiyonun diğerlerinden farkı yapıcı metodunda static olmasıdır. Hatırlarsanız C# dilinde static yapıcı metotlar bir uygulamada ancak ve ancak bir nesne yaratıldığında ya da static bir üye elemanı referans edildiğinde bir defaya mahsus olarak çalıştırılır. Yani yukarıdaki versiyon farklı kanalların (multi-thread) birden fazla singleton nesnesi yaratması imkansızdır.

Bu yazıma Singleton (tek) tasarım desenini hakkında temel düzeyde edindiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur 🙂

Bir sonraki yazımda görüşmek üzere

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff650316(v=pandp.10)?redirectedfrom=MSDN

Leave a Comment