Singleton Pattern:
اشیاء زیادی وجود دارند که ما فقط و فقط به یک نمونه آن از اشیاء نیاز داریم. برای مثال سیستم شما فقط می تواند فقط یک نمونه از پورت COM1 را داشته باشید یا در اداره شما فقط می تواند یک مدیر عامل وجود داشته باشد و …. حال فرض کنید که شما کلاسی دارید که فقط باید یک نمونه از آن ایجاد شود. شما این مسئله را چگونه حل می کنید؟
Singleton Pattern، الگوی است که برای اینکار ایجاد شده است. یعنی اطمینان از اینکه از کلاس ما فقط یک نمونه ایجاد شده است. این الگو برای این به کار می رود تا ایجاد نمونه از یک کلاس را محدود کند.
نحوه پیادسازی:
آسانترین راه برای ایجاد کلاسی که فقط می تواند یک نمونه از آن ایجاد شود استفاده از یک متغییر استاتیک در داخل کلاس می باشد. اولین نمونه ای که از این کلاس ایجاد می شود ما متغییر استاتیک را مقدار True می دهیم و در سایر دفعات این متغییر استاتیک در سازنده تست می شود اگر مقدارش False باشد یک نمونه از شی ایجاد خواهد شد در غیر این صورت نمونه جدیدی از آن شی ایجاد نخواهد شد.
نمونه کد اول در VB.NET |
تعریف کلاس Public Class Singleton Private Shared instance_flag As Boolean = False Private _Id As Integer
Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value End Set End Property
Public Shared Function GetInstance() As Singleton If (Not instance_flag) Then instance_flag = True Return New Singleton Else Return Nothing End If End Function
End Class |
نحوه استفاده Dim Ins1, Ins2 As Singleton Ins1 = Singleton.GetInstance Ins2 = Singleton.GetInstance Ins1.Id = 200
Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id)
Ins2.Id = 123 Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id)
Console.ReadKey() |
خروجی: هنگام استفاده از کلاس بالا به شیوه ای که نوشته شد نمونه دوم از آن هیچ وقت ایجاد نخواهد شد پس تمام عملیاتی که نمونه دوم می خواهد انجام دهد با خطا همراه خواهد بود. برای حل این مشکل می توانیم به صورت زیر عمل کنیم. |
نمونه کد دوم در VB.NET |
تعریف کلاس Public Class Singleton Shared m_instance As Singleton Private _Id As String Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value End Set End Property Public Shared Function GetInstance() As Singleton If (m_instance Is Nothing) Then m_instance = New Singleton() End If Return (m_instance) End Function
Private Sub New() End Sub End Class |
نحوه استفاده Dim Ins1, Ins2 As Singleton Ins1 = Singleton.GetInstance Ins2 = Singleton.GetInstance Ins1.Id = 200
Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id)
Ins2.Id = 123 Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id)
Console.ReadKey() |
خروجی:
200 200 123 123 |