Singleton Paterni
Pratikte çoğu zaman tekil olarak yaratılmasını istediğimiz nesne örnekleri vardır. Ancak burada nesne sözcüğünden kastedilen anlam; nesne isminin tekil olması değil, nesnenin taşıdığı referans değerinin tekil olmasıdır. Singleton paterninin uygulanmadığı sınıf tasarımlarında, nesne yaratmak amacı ile sınıfa ilişkin başlangıç fonksiyonu çağrıldığı anda nesne yeni bir referans (adres) değerini taşıyacak şekilde yaratılır. Oysa pek çok durumda yaratılan ilk nesne örneğinin belirli bir referans değeri taşıması, aynı sınıfa ilişkin diğer nesnelerin yaratıldıklarında ise yeni bir referans değil, ilk nesne ile aynı referansı taşıması istenir. İşte bu tür durumlarda kullanılan singleton paterni; belirli bir nesnenin sadece tek bir örneğinin yaratılmasını sağlar.
Singleton paterninin uygulanmasında anahtar nokta; başlangıç fonksiyonunun private olması ve nesne yaratma aşamasında kullanılacak özel bir fonksiyonun sınıfa eklenmesidir. Bu fonksiyon (örnekte CreateObject olarak isimlendirilmiştir) söz konusu sınıf türünde referans değeri döndüren, statik bir fonksiyon olmalıdır. Fonksiyonun döndürdüğü referans, sınıf ile aynı türde tanımlanmış (örnekteki obj nesnesi) statik bir değişken içerisinde tutulur. Böylece ilk elde edilen referans değeri sabit kalacak ve CreateObject() fonksiyonunun sonraki çağrımlarında kullanılabilecektir.
[VB .NET]
Public Class CSingleton
Private Shared obj As CSingleton
Private a As Integer = 10
Private Sub New()
'private, default constructor
End Sub
Public Shared Function CreateObject() As CSingleton
If (IsNothing(obj) = True) Then
obj = New CSingleton
End If
Return obj
End Function
Public ReadOnly Property Data() As Integer
Get
Return obj.a
End Get
End Property
End Class
Module Module1
Sub Main()
'Dim oSng as CSingleton = New CSingleton()
'Hata
Dim oSng1 As CSingleton = CSingleton.CreateObject()
Console.WriteLine(oSng1.Data)
Dim oSng2 As CSingleton = CSingleton.CreateObject()
Console.WriteLine(oSng2.Data)
End Sub
End Module
Şekilde de görüldüğü gibi Main içerisinde, CreateObject() fonksiyonunun döndürdüğü tekil referans değeri ile yaratılan oSng1 ve oSng2 nesneleri, managed heap üzerinde aynı bölgeyi referanse etmektedir. Bu bölgedeki a değişkeninin kendisi de private olarak tanımlanmış olduğu için Data isimli property ile sadece ilk değeri olan, 10 alınıp ekrana yazdırılmıştır.
İpucu : Şu haliye oSng1 ve oSng2 nesneleri, hem kendisi hem de gösterdiği yer sabit (const) olan pointer’lara benzetilebilir. Bu nesneleri sadece kendisi sabit olan göstericilere çevirmek adına Data property’sine set bloğu eklenebilir.
[VB .NET]
Public Class CSingleton
Private Shared obj As CSingleton
Private a As Integer = 10
Private Sub New()
'private, default constructor
End Sub
Public Shared Function CreateObject() As CSingleton
If (IsNothing(obj) = True) Then
obj = New CSingleton
End If
Return obj
End Function
Public Property Data() As Integer
Get
Return obj.a
End Get
Set(ByVal Value As Integer)
obj.a = Value
End Set
End Property
End Class
Module Module1
Sub Main()
'Dim oSng as CSingleton = New CSingleton()
'Hata
Dim oSng1 As CSingleton = CSingleton.CreateObject()
oSng1.Data = 15
Console.WriteLine(oSng1.Data)
Dim oSng2 As CSingleton = CSingleton.CreateObject()
Console.WriteLine(oSng2.Data)
End Sub
End Module
Aykut Taşdelen












Android’te Grafik Kaynakları-2 : View Nesnelerine Hareket Kazandırmak
Android’te Grafik Kaynakları-2 : View Nesnelerine Hareket Kazandırmak
IBM Yazılım Akademisi 2011
C#’a GENEL BAKIŞ
Kullanıcı Tahminli Sayı Tahmin Oyunu