Respond needs javascript to run. To find out more click here
Singleton Design Pattern » » Serdar Demir Uefa Maçları Canlı İzle
RSS
 

Singleton Design Pattern

06 Mar

Tasarım Desenleri (Design Pattern) ilk duyduğunuzda aklınıza gelen Kullanıcı Arayüzü ile alakalı bir terim değildir. Bunlara, uygulama kodları için oluşturulmuş kalıplardır diyebiliriz. İlk bakışta insana garip gelebiliyor ama öğrenmekten zarar çıkmaz. Belli olmazi bir gün lazım olur.
Baştan uyarayım bu makaleyi anlayabilmek için nesneye yönelik programlamayı bilmeniz gerekmektedir.
Burada Singleton deseninden bahsedeceğim. İlk önce şunu açıklığa kavuşturalım. Bu nerelerde lazım olabilir.
Bir örnekle açıklamaya çalışayım. Bir seçenek yönetici sınıfımız olsun. Bu sınıf uygulamamızda kullanacağımız işlemler için kullanıcı seçeneklerini yöneten özelliklere(property) sahip olsun. Örneğin:

  1. public string SiteAdresi { getset; }
  2. public int GuncellemePeriyodu { getset; }
  3. // vb…

Seçenek yöneticimiz ile bu değişkenlerin değerlerine ulaşıp uygulamamızda kullanabiliyor ve istersek değiştirebiliyoruz. Haliye bu değişkenlerin değerlerinin bir yerde tutulması gerekir. Bir dosya veya kayıt defteri gibi. Eğer bu seçenek yöneticisi sınıfından birden fazla nesne oluşturulsa, bir nesnenin yaptığı değişiklik diğer nesneler tarafından bilinmeyeceği için karışıklığa yol açabilir. Örneğin bir seçeneğin değerindeki değişikliği sadece değişikliği yapan nesne bilecektir. Diğer nesneler hala eski değeri vereceği için diğer nesnelerin kullanıldığı tarafta hatalar meydana gelebilir. Biraz karıştı gibi değil mi? Bende farkındayım ama toparlamaya çalışacağım.
Bir yerde bir kitap düşünelim. Bu kitap bizim seçenekleri kaydettiğimiz dosya yerine geçecek. Bu kitapta yazanları okuyup bize bildiren 3 kişi olsun. Ayrıca bu kişiler istersek kitapta yazanları değiştirebiliyor. A, B ve C kişileri bu kitabı birer kere okuyup hafızalarına aldıklarını ve sorduğumuzda ezberden cevapladıklarını düşünelim. Seçenek dosyasının okunup değerlerin hafızaya alınması gibi. Biz A kişisine kitaptaki bir yeri değiştirmesini söylediğimizde, B ve C kişileri kitabı bir daha okuyana kadar bu değişiklikten haberdar olmayacaklardır ve sorduğumuzda kitabın eski haline göre cevap vereceklerdir. Bu da karışıklığa yol açacaktır. Oysaki sadece bir kişi bu işten sorumlu olsaydı böyle bir sorun olmazdı.

İşte Singleton bu gibi durumlar kullanılan bir desendir. Bu desende oluşturulan sınıfların sadece bir nesnesi olabilir. Diğer nesnenin oluşturulması programatik olarak engellenir. Yani istense de oluşturulamaz.
Şöyle bir kod düşünelim:

  1. class SecenekYoneticisi
  2. {
  3. public SecenekYoneticisi();
  4. public string SiteAdresi { getset; }
  5. public int GuncellemePeriyodu { getset; }
  6. public void SecenekleriOku();
  7. public void SecenekleriGuncelle();
  8. }

Bu sınıfı sadece bir nesne üretmesine izin verecek şekilde nasıl ayarlarız. Öncelikle bu sınıfın kullanabileceğimiz tek nesnesini oluşturalım. Sonra diğerlerinin oluşturulmasını engelleriz. Sınıfın içerisine sınıfın kendi türünden static ve private bir değişken koyalım.

  1. private static SecenekYoneticisi _yonetici;

Sonra bu private değişkene ulaşabilmek için static bir property tasarlıyalım:

  1. public static SecenekYoneticisi Yonetici
  2. {
  3. get
  4. {
  5. if (_yonetici = null)
  6. _yonetici = new SecenekYoneticisi();
  7. return _yonetici;
  8. }
  9. }

Yukarıdaki kodu incelersek; oluşturduğumuz özellik sadece değişkeni okumamızı sağlıyor. Atamaya izin vermiyor. get bloğunda _yonetici değişkeninin null olup olmadığını kontrol ediyoruz. Eğer boş ise içerisine bir SecenekYoneticisi atıyoruz ve o haliyle geri döndürüyoruz. Boş değilse zaten önceden atanmış bir SeceneYoneticisi vardır ve tekrar atamaya gerek yoktur.

Buraya kadar tamam. Peki başka bir nesne oluşturulmasını nasıl engelleyeceğiz. Bunun için çok küçük bir hile mevcut. Sınıfımızın yapılandırıcısını private olarak yazacağız. Yani:

  1. // public SecenekYoneticisi();
  2. private SecenekYoneticisi();

Bu sayede bu sınıftan nesne üretmek sadece sınıf içerisinde mümkün olabilir. Eğer C++ kullanıyorsak private yapılandırıcıya izin vermeyebilir. Önemli değil, protected olarak işaretlemekte aynı sonucu verecektir.

Sınıfımızın son haline bir bakalım:

  1. class SecenekYoneticisi
  2. {
  3. private SecenekYoneticisi _yonetici;
  4. private SecenekYoneticisi();
  5. public string SiteAdresi { getset; }
  6. public int GuncellemePeriyodu { getset; }
  7. public void SecenekleriOku();
  8. public void SecenekleriGuncelle();
  9. public static SecenekYoneticisi Yonetici
  10. {
  11. get
  12. {
  13. if (_yonetici = null)
  14. _yonetici = new SecenekYoneticisi();
  15. return _yonetici;
  16. }
  17. }

18.  }
Eğer bu sınıfı kullanmak istersek oluşturduğumuz Yonetici özelliğini kullanmamız yeterli.

1.  SecenekYoneticisi.Yonetici.SecenekleriGuncelle();

Elimden geldiğince anlatmaya çalıştım ama böyle bir konu gerçekten ihtiyaç duyana kadar tam olarak anlaşılamayacaktır. Bol bol proje yapmaya çalışın. Her projeniz size yeni birşey öğretsin. Yazım hataları var ise affola. İyi günler dilerim.

 
No Comments

Posted in C#, Makaleler

 

Leave a Reply