Neyse biz konumuza geri dönelim . Design patterns Eric Gamma,Richard Helm,Ralph Johnson ve John Vlissides tarafından oluşturulmuştur.Design patterns guruları olarak bilinen bu 4 kişi Gangs Of Four(GoF) olarak da bilinirler.
GoF tasarımları 3 ana konu altında toplanırlar .
1-) Creatinal Patterns : Bu ana başlık altında toplanan desenler bir nesnenin oluşturulması ve yönetilmesi ile ilgili desenlerdir.Bu makalemde anlatacağım Singleton deseni de bu grup altına girmektedir.
- Abstact Factory
- Builder
- Factory Method
- Prototype
2-) Behavioral Patterns : Bu grupta bulunan desenler ise belirli bir işi yapmak için farklı sınıfların nasıl birlikte davranacakları ile ilgilidir.
- Command
- Iterator
- Chain of Responsibilty
- Interpreter
- Mediator
- Memento
- Observer
- Strategy
- Visitor
- State
- Template Method
3-) Structural Patterns : Bu desenler çeşitli nesnelerin birbirleri arasındaki ilişkilerini ele alan desenlerdir.
- Adapter
- Composite
- Decorator
- Bridge
- Proxy
- Facade
- Flyweight
Singleton deseni yazdığınız bir uygulamanın hayatta kaldığı sürece bir class dan sadece bir örnek(instance) alınmasını garanti eden desendir.Bu tanımı bir örnekle anlatmak gerekirse diyelim ki bir veri tabanı uygulamanız var ve tek bir connection string iniz var.Bu connection string i her defasında instance alınarak oluşturulmasını istemiyorsunuz.Bir kere instance alınsın defelarca kullanılsın istiyorsunuz.İşte sizin aradığınız şey tam olarak Singleton desenidir.Hadi gelin singleton yöntemlerine bakalım ..
1.Yöntem ...
class Logger
{
private static object lockObject = new
object();
private static Logger instance=null;
private Logger()
{
/* bu şeklide bir constructure oluşturulursa
new kullanılarak ınstance alınamaz*/
}
public static Logger CreateInstance()
{
return instance;
/*şeklinde tanımlama yaparak new olarak erişim
sağlanmaz.Bu şekilde erişim sağlanır.Yeni bir Looger oluşturulmak isteniliyorsa
bu method çağırılmalıdır.
public static Logger Instance
{
get { return
instance ??/*bu operant ınstance değişkenini geri döndürmeye
çalış eğer null ise bu operantın devamındaki komutu çalıştırır.*/
CreateInstance(); }
}
}
Şeklinde bir yöntem kullanılırsa eğer uygulamanız multi thread değilse gayet güzel çalışır.Multi thread olsa da çalışır fakat çok düşük bir ihtimal de olsa multi thread yapı kullandığınızda aynı anda Looger sınıfından instance alma isteği olabilir.İşte bu durumda sorun çıkar.Eğer multi thread yapısı kullacaksanız aşağıdaki yöntemi kullanmanızı öneriyorum arkadaşlar.
2. Yöntem ...
class Logger
{
private static object lockObject = new
object();
private static Logger instance=null;
private Logger()
{
/* bu şeklide bir constructure oluşturulursa
new kullanılarak ınstance alınamaz*/
}
public static Logger CreateInstance()
{
if (instance==null)
{
lock (lockObject)
{
instance = new Logger();
if (instance==null)
{
instance = new Logger();
}
/*bu blog içerisinde kitleme işlemi yapılır.Bu işlemle birlikte multi
thread desteği de sağlanmış olunur.Bu yapının üzerine istenilen methodlar oluşturulur.*/
}
instance = new Logger();
}
return instance;
Static değişkenler
Appdomain altında yaratılır.Logger sınıfı aynı anda hem main thread den hem de
bizim uygulamamızda açılan threadler tarafından aynı anda yaratılmak ıstenebilir.Bu
nedenle Logger nesnesı oluşturulduktan sonra kitlenir.Ve onu oluşturulan thread
onu tekrar açana kadar bir daha açılmaz.
*/
}
public static Logger Instance
{
get { return
instance ??/*bu operant ınstance değişkenini geri döndürmeye
çalış eğer null ise bu operantın devamındaki komutu çalıştırır.*/
CreateInstance(); }
}
}
agzınıza saglık...
YanıtlaSilTeşekkür ederim ...
YanıtlaSilgüzel bir paylaşım olmuş gerçekten
YanıtlaSil