Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Tasarım Desenleri - Design Patterns | Abstract Factory Tasarım Deseni - Abstract Factory Design Pattern>>

Singleton Tasarım Deseni - Singleton Design Pattern

Yazar harunozer 05 October 2012

Singleton Tasarım Deseni - Singleton Design Pattern Tasarım desenleri makale dizisinin ilk durağı creatinal patterns grubuna ait singleton tasarım desenini ufak bir örnekle anlatmaya çalışacağım. dofactory.com a göre kullanım oranı 80% olan bu tasarım deseninin amacı uygulamanın yaşam süresince bir nesnenin bir kez oluşturulmasını sağlamaktır.

Creatinal patterns grubuna ait singleton tasarım deseni (Singleton design pattern) bir nesnenin application pool kapanana kadar bir kez üretilmesini kontrol altında tutar. Aynı zamanda bu nesne sınıf dışından da erişilebilinir olur. Bir sınıfın bir anda sadece bir örneğinin olması istenildiği zamanlarda kullanılır. Örneğin veritabanı uygulamalarında bir anda bir bağlantı nesnesinin olması sistem kaynaklarının verimli bir şekilde kullanılmasını sağlar.

Bu desenin kullanımı oldukça basittir. Singleton deseni uygulanacak sınıfın constructor(yapıcı) metodu private yapılır ve sınıfın içinde kendi türünden static bir sınıf tanımlanır. Tanımlanan bu sınıfa erişimi sağlayacak bir metot veya property de sınıfa eklenir. Bu desenin birden fazla kullanım şekli olsa da genel anlamda bu şekilde kullanılır.
 
public class SingletonSinif
{
/*Constructor private yapılarak bu sınıf dışından instance (örneğinin) alınmasını engelliyoruz */
    private SingletonSinif() { } 
 
    private static SingletonSinif _TekNesne = new SingletonSinif();
 
    /*Oluşturulan static nesnenin(_TekNesne) dışarıdan erişilmesini sağlamak için property tanımı*/
    public static SingletonSinif Sinif 
    {
        get 
        { 
            return _TekNesne; 
        }
    }
 
    /*Oluşturulan static nesnenin dışarıdan erişilmesini metot ile de sağlayabiliriz*/
    public static SingletonSinif Sinif2()
    {
        return _TekNesne;
    }
 
    /*Sınıfın kullanılacak metot ve özellikleri tanımlanır*/
    public int toplam(int s1, int s2)
    {
        return s1 + s2;
    }
}
 
Yukarıda singleton deseni ile oluşturulan sınıfta Sinif propertysi veya Sinif2 metodundan biri olmalıdır. Bu sınıfın kullanımı aşağıdaki gibidir.
int t1 = SingletonSinif.Sinif.toplam(1, 2);
 
veya
 
int t2 = SingletonSinif.Sinif2().toplam(2, 3);
 
Örneğimizdeki sınıfı sınıf dışından new anahtar sözcüğü ile oluşturamayız, çünkü constructor metot private olarak tanımlanmıştır fakat private ile tanımlanmış metot sınıf içinden erişilebilir olduğu için sınıf içinde new ile örneği static bir değişkene atanabilinir. Yani constructor metodu private yaparak sınıfın dışarıdan örneğinin alınmasını engelledik ve sınıf içinde static bir değişkene örneğini alarak bir örnek elde ettik. Bu örneğin dışarıdan erişilebilinmesi için de bu örneği geri döndüren static bir metot veya property ekledik.
Singleton deseni başka şekillerde de kullanılabilinir. Aşağıdaki yöntem ile static nesnenin ilk kullanımda örneğinin alınması sağlanır.
 
public class SingletonSinif3
{
    private static SingletonSinif3 _TekNesne;
 
    private SingletonSinif3() { }
 
    public static SingletonSinif3 Sinif 
    {
        get 
        {
/*static nesneye ilk erişimde sınıfın örneği atanıyor.*/
            if (_TekNesne == null) 
                _TekNesne = new SingletonSinif3();
                
            return _TekNesne; 
        }
    }
}
 
Multi thread olmayan uygulamalarda bu yöntemler kullanılabilinir fakat multi thread uygulamalarda bu yöntemler ile nesnenin bir kez oluşturulması kesinleşmez. Multi thread uygulamalarda aşağıdaki şekilde singleton deseni kullanılabilinir.
public class SingletonSinifi4
{
    private static SingletonSinifi4 _TekNesne;
    private static Object lockObject = new Object();
 
    private SingletonSinifi4() { }
 
    public static SingletonSinifi4 Sinif 
    {
        get 
        {
            if (_TekNesne == null)
            {
                lock (lockObject)
                {
                    if (_TekNesne == null)
                        _TekNesne = new SingletonSinifi4(); 
                }
            }
                
            return _TekNesne; 
        }
    }
}
 
Bu yöntem de; nesne oluşturulmadığında yani null olduğunda lock anatarı arasındaki blok kilitlenerek başka kanalların lock bloğunun içine erişimini engeller ve nesne hayla null ise nesne örneği oluşturulur.
Örnek kodları aşağıdaki linkden indirebilirsiniz.
 

SingletonSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 9  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri