Singleton Design Pattern

Tekrar selamlar. Daha önce de bahsettiğim üzere tasarım desenleri üzerine birşeyler karalamaya başladım. Bu günkü tasarım desenimiz, belki de en bilinen ve projelerden sıklıkla, bilenin severek bilmeyenin farkında olmadan kullandığı bir tasarım deseni olan Singleton patternini inelemeyece çalışacağım naçizane.

Tabi bu arada şunu da belirtmemizde büyük fayda var. Bu anlatılanları ve diğer sitelerdeki paylaşımlardan tam verim sağlamak için oop(Object Oriented Programmig) temellerinin iyi bilinmesi gerekmektedir. Aksi takdir de bazı kavramların içi boş kalmaktadır ki, zaten anlaşılması güç olan yerlerin de olduğunu düşündüğümüzde pek de faydalı olmayacaktır. Bu yüzden önce oop temellerinin öğrenilmesi, okunulanların anlaşılmasında büyük yardımcı olur.

Tasarım desenleri uygulanması şart koşulan şablonlar olmadığını daha önce de söylemiştik, sadece yazılımcıya daha kolay programlama imkanı verir ve işini kolaylaştırır. Bu desenlerden özellikle bazıları çok kullanışlı iken bazıları da sadece yazılım işinin sanatsal yani tasarımsal halini göstermek için geliştirilmiştir. Bunları sık sık tekrarlamamın sebebi, bu konuya yeni başlayacak arkadaşların sürekli aynı soruları sormalarını engellemek ve kafalarındaki karışıklığı atmak için sadece :)

Buyrun başlayalım...

Singleton design pattern'ini kısaca şu şekilde tanımlarız. Bir programın çalıştığı sürece, iç yapısında buluna herhangi bir sınıfın nesnesinin sadece ve sadece tek bir nesnesinin olmasını garantiler. Peki biz bu işlemi nasıl gerçekleyeceğiz? Yani bir sınıftan 2. nesne örneğini oluştursak da hala nasıl tek bir örnek olacak. Basit bir örnek kod ile ne dediğimizi anlatmaya çalışalım...

public class Singleton
{
private static Singleton nesne = new Singleton();
// sınıf içerisinde kendi nesne örneği(static olmasına dikkat!)

private Singleton() // private yapıcı
{
}

public static Singleton nesne // nesne erişimi
{
get
{
return nesne; // Bu kod sayesinde döndürülen nesne aynı olacak
// ve nesne üzerindeki oynamalara izin vermeyeceğiz.
}
}
}

Bu program çalıştırıldığı anda statik olan Singleton nesnesi yaratılacaktır. Bunun da main fonksiyonundan new anahtar sözcüğüyle değil de, sınıfın kendi içerisnde gerçekleşmesini sağladık. Bu şekilde her kullanışımızda bize programın ilk çalışmasında oluşturduğumuz nesneni geri döneceği garantilenmiş olur.

Bu yapıyı daha farklı şekillerle de gösterebilirdik. Birlikte bakalım...

public class Singleton
{
private static Singleton Nesne;

private Singleton()
{
}

public static Singleton nesne()
{
if (nesne == null) // Nesne yaratılmadıysa
nesne = new Singleton(); // Yarat

return nesne; // Eğer nesnemiz zaten yaratılmışsa geri gönder
}
}

Bu yapıyı kontrol ettiğimizde de program çalışınca nesne hemen oluşturulmuyor da, biz o nesneyi ilk defa kullanmak istediğimiz zaman yaratılıyor.

Bir diğer yapı ise özellikle multithread uygulamalarda karışımıza çıkmaktadır ve gerçekten de kullanışlıdır. (Multithread uygulamalar, birbirinden farklı thread'lerin aynı nesne üzerinden tekrar tekrar çağrılması ve yaratılması olarak kısaca özetlenebilir. Yani ortada birden fazla yaratılan nesneler mevcuttur ve singleton'ı ben burdayım siye çağırır adeta :) )

public class Singleton
{
private static Singleton nesne;

private static object threads = new object(); // Thread uygulaması için gerekli object nesnemiz

private Singleton()
{
}

public static Singleton()
{
if (nesne == null) // Nesnemiz ilk defa yaratılıyorsa
{
lock (threads) // Önce bloklanır ve buraya başka threadlerin erişmesi engellenir.
{
if (nesne == null)
// BU bölüm ise içeri giren başka thread'in yeni bir nesne oluşturmasını engeller
nesne = new Singleton();
}
}

// Bloklama bitince, ilk giren thread nesneyi oluşturmuş olur ve sınıfın bir nesnesi oluşturulmuş olunur.
return nesne;
}
}

Toparlayacak olursak; bir sınıfa ait örneğin, çalışma zamanında tek olmasını garantilemek istiyorsak Singleton pattern'ini kullanmak kesinlikle bize yardımcı olacaktır. Kullanım yerleri oldukça yoğun olmakla birlikte, Yazılımcının hayal dünyasıyla da birebir etkilidir :)

Herkese Bol kodlu sağlıklı günler :)

Yorumlar

Bu blogdaki popüler yayınlar

Socket Kavramı

Dönem Sonu ve Bitirme Projesi

Aselsan ve MetuTech Gezisi