Makale Özeti

Bu makalede VB.NET ile Singleton paterninin kullanılışı anlatılmakta ve örneklenmektedir.

Makale

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 yapılması ve nesne yaratma aşamasında kullanılacak 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.

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

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.

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
MVP Most Valuable Professional

aykuttasdelen@yazgelistir.com