Anasayfa / Genel / JAVA - Singleton Design Pattern

JAVA - Singleton Design Pattern

Singleton Design Patterni ile bütün sistemin kullanabileceği ancak sadece o classtan bir tek nesnenin yaratılmasını istediğimiz durumda kullanılır. (İkinci bir nesne yaratılamaz .)
Örnek kod ve yazı Özcan Acar'ın www.kurumsaljava.com adlı sitesinden alınmıştır.

package org.javatasarim.pattern.singleton;
/**
* Singleton tasarim sablonu örnegi
*
* @author Oezcan Acar
*
*/

public class Singleton
{

/*
* Singleton sinifindan olusturulabilecek
* tek nesne static sinif degiskeni olarak
* tanimlaniyor.
*/

private static Singleton instance = null;

/*
* Double check locking yapabilmek
* icin kullanilan nesne.
*/

private static Object lock = new Object();

/**
Özcan Acar - www.KurumsalJava.com
* Baska siniflarin new Singleton()
* seklinde nesne olusturmalarini,
* sinif konstruktorünü private
* yaparak engellemis oluyoruz.
*
*/

private Singleton()
       {
              System.out.println("singletion init()");
       }

/**
* Singleton sinifindan olusturulabilen
* tek nesneye ulasmak icin instance()
* metodu kullanilir.
*
* @return Singleton static Singleton nesnesi
*/


public static Singleton instance()
{
       if(instance == null)
   {
// Double checked locking
       synchronized (lock)
       {
              if(instance == null)
             {
                    instance = new Singleton();
             }
        }
    }
         return instance;
}


/**
* Singleton sinifinda bulunan
* bir metod.
*/


public void printThis()
      {
            System.out.println(this);
       }
}



Bir singleton sınıfın taşıması gereken bazı özellikler vardır. Bunlar:

· Sınıf constructor methotlarının private olması gerekiyor.
Constructorı  private olan bir sınıftan, başka bir sınıf new operatörü ile nesne oluşturamaz.

· Singleton sınıfından sadece bir tane nesne oluşturulması gerektiği için, oluşturulması
gereken nesneyi sınıfın static değiskeni olarak tanımlamamız gerekiyor.
Yukardaki örnekte
 private static Singleton instance = null;
 şeklinde bu tanımlamayı yapıyoruz.

· Singleton sınıfında instance() isminde static bir metodun olması ve bu metodun static
olarak tanımlanmış nesneyi geri vermesi gerekiyor. instance() metodu içinde sınıfın tek
nesnesi olacak değişken oluşturulur.


Ayrıca Double checked logging yapılmasının sebebi,

Sistemde T1 ve T2 isimlerinde iki thread mevcut olsa ve double checked logging yapılmasa , T1 ve T2 threadleri iki adet nesne oluşturabilirler bu ise Singelton design paternine ters olan bir şey. Bu sebeple T1 ve T2 threadlerimizi kullanarak, nasıl double checked locking metodunun, iki sefer new Singleton() yapılmasını önlediğini görelim:

T1 instance() metoduna girer ve if(instance == null) satırını değerlendirir.
 Burada T1 thread scheduler tarafından bloke edilebilir. Biz edilmediğini ve T1’in devam ettigini düşünelim. T1 synchronized bloguna girdigi andan itibaren, bu bloga T2’nin girmesi imkansızdır. Şimdi T1’in syncronozed bloğuna girdikten sonra bloke edildigini düşünelim. Bu durumda T2 sadece synchronized metodunun önüne kadar gelip, T1 bu bloktan çıkana kadar beklemek zorundadır, çünkü T1 lock nesnesinin synchronized lock mekanızmasını elinde tutmaktadır.
T1 bunu geri vermedigi sürece, yani synchronized bloğundan çıkmadığı sürece, diğer
threadler bu bloğa girmezler. T1 kontrülü tekrar eline aldıktan sonra, emin olmak icin bir daha
if(instance== null) satiri ile, nesnenin oluşturulup, oluşturulmadığını kontrol eder.
Eger T1 synchronized metoduna girmeden bloke olmuşsa, T2 bloğa girmiş ve new Singleton() yapmış olabilir. Tekrar kontrol edildiği için bu mekanizmanin ismi double checked locking’dir.
Metoda ilk girişte if(instance == null ) ile kontrol edilir ve kontrol synchronized bloğunda
tekrarlanır. Bu şekilde singleton nesnesinin birden fazla init edilmesi önlenmiş olur.



Bir test sınıfı ile,singleton nesnesi kontrol edilebilir.

package org.javatasarim.pattern.singleton;

/**
* Singleton tasarim sablonu test sinifi
*
* @author Oezcan Acar
*
*/

public class Test
{

/**
* main
* @param args
*/
 
      public static void main(String[] args)
      {
         for(int i =0; i < 10; i ++)
         {
                Singleton.instance().printThis();
         }
      }
}


Ekran Çıktısı :
singletion init()
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1
com.deneme.singleton2.Singleton@9304b1



Ekran çıktısında görüldüğü gibi, singleton sınıfından sadece bir nesne oluşturuluyor. Bunu
singleton init() çıktısı ile görüyoruz. Daha sonraki satırlarda aynı nesne kullanılarak,
printThis() metodunun çıktısı ekrana geliyor.

Singleton tasarım şablonu ne zaman kullanılır?
- Sistem bünyesinde bir sınıftan sadece bir nesne üretilerek bu nesnenin kullanılması
gerektiği durumlarda singleton tasarım şablonu kullanılır.
İlişkili tasarım şablonları:
- Abstract Factory, Builder ve Prototype tasarım şablonlarında olabileceği gibi
birçok tasarım şablonu Singleton tasarım şablonu kullanılarak implemente edilir.

Yorum Yaz
Arkadaşların Burada !
Arkadaşların Burada !
Bu içeriği duvarında Paylaş
  • Bu içeriği arkadaşlarınla paylaş!
  • Yeni içerikler bul!