Şu Anda Baktığınız Yer
Category: Design Patterns

Singleton Tasarım Deseni

Singleton Tasarım Deseni

Amaç ve Özelikler

-Yaratılışsal(Creational) tasarım desenlerindendir.

-Sadece tek bir nesne üretibilir olması amaçlanır. Örn: İnternet sitelerinde kullanıcı giriş nesnesi. (Login Class)

-Sistemin bütün bileşenlerinden ulaşım sağlanması amaçlanır.

Problem

-Uygulamada aynı sınıftan birden fazla olduğunda çıkabilecek problemler.

Nasıl Uygulanır?

Sınıfın tek seferlik yaratılabilir nesnesini, kendini yaratma, atama yapma ve erişim yetkisini verecek şekilde tanımlamamız gerekir. Sınıfın(Singleton) tek nesnesini(Singleton nesnesi) Private Static olarak tanımlayarak başlayabiliriz.

Ardından Singleton nesnesinin başlangıç değerini(initialization) verecek olan kodu sarmalayan(encapsulate) Public Static bir fonksiyon yaratırız. Constructor ise Protected veya Private olarak yaratılır.

Kullanıcı tek seferlik nesneye ihtiyaç duyduğunda bu fonksiyonu sınıf adını kullanarak çağırarak (Örn:Singleton.getInstance()) tek olan nesneyi kullanmaya başlayabilir.

 

Kodlarken

-Singleton sınıfı içerisinde private static nesne tanımlanır.

-Public static fonksiyon tanımlanır.

-Erişim fonksiyonunda Lazy Initialization kullanılır.

-Construction fonksiyonları protected veya private

-Kullanıcılar Singleton nesnesini kullanabilmek için erişim fonksiyonundan yararlanmalıdırlar.

Programlama Dillerinde Singleton

Singleton C# Kodu

Singleton C++ Kodu

-Singleton Java Kodu

Singleton Java Gerçeklemesi

Singleton Java Gerçeklemesi

1- Basit Java Singleton Modeli

public class Singleton {



   private static Singleton instance;



   private Singleton(){ }



   public static Singleton getInstance( )
   {
      if(instance== null)
         instance= new Singleton();



      return instance;
   }



   protected static void doSmt( ) {
      System.out.println("Singleton Metod");
   }
}



public class SingletonDemo {
   public static void main(String[] args) {
      Singleton singleton = Singleton.getInstance( );
      singleton.doSmt( );
   }
}
Singleton C++ Gerçeklemesi

Singleton C++ Gerçeklemesi

Lazy Initialization

#include;



using namespace std;



class Singleton
{



private:
    static Singleton *single;
    Singleton()
    {
        //private constructor
    }



public:
    static Singleton* getInstance();
    void method();
};



Singleton* Singleton::single = NULL;



Singleton* Singleton::getInstance()
{
    if(single == NULL)
    {
        single = new Singleton();
        instanceFlag = true;
        return single;
    }
    else
    {
        return single;
    }
}



void Singleton::method()
{
    cout << "Method of the singleton class"<< endl; } int main() { Singleton *sc1,*sc2; sc1 = Singleton::getInstance(); sc1->method();
    sc2 = Singleton::getInstance();
    sc2->method();



    return 0;
}
C# Singleton Gerçeklemesi

C# Singleton Gerçeklemesi

1-Kötü Kodlama thread Safe Değil

public sealed class Singleton
{
    static Singleton instance=null;



    Singleton()
    {
    }



    public static Singleton Instance
    {
        get
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

2-Thread Safe Kodlama
Bu kodlamada lock kullanılarak birden fazla nesnenin aynı anda singleton nesnesine erişimi engellenmiştir.

public sealed class Singleton
{
    static Singleton instance=null;
    static readonly object padlock = new object();



    Singleton()
    {
    }



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

3-Kötü Kodlama Thread Safe, İki Kere Kontrol

public sealed class Singleton
{
    static Singleton instance=null;
    static readonly object padlock = new object();



    Singleton()
    {
    }



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