Design patterns – Part 3: Singleton pattern
The simplest way to describe singleton class is to look at the definition:
The Singleton Pattern ensures a class has only one instance, and provides a point of access to it.
So why would you need that? Well, there are many objects you only need one of in your application (e.g. Logging, text trimming, for loading strings from a view, etc.). It assures you that you only have one instance of the class and that no one can create another instance on its own. Thus, you need a global access point to deliver the handle to the class.
How do we do that?
I will use my text-trimming class (called CLimitedString) for this presentation. The class is pretty simple. It’s basic task is to trim text after n characters and append “…” afterwards. Default limit is set to 30, but user can set other value via Limit property.
Private Class CLimitedString Private m_nLimit As Integer Public Sub New () 'setting default value Me.m_nLimit = 30 End Sub Public Property Get Limit As Integer Limit = Me.m_nLimit End Property Public Property Set Limit As Integer Me.m_nLimit = Limit End Property Public Function Process (source As String) As String If (Len (source) < Me.Limit) Then Process = source Exit Function End If Process = Strleftback (Left (source, Me.Limit), " ") &_ "..." End Function End Class
As LotusScript does not support private constructors, we will have to create a private class instead. This means that you won’t be able to access this class from anywhere else but this ScriptLibrary. Thus, we need to create a global variable to store class instance and a script library function as a global point of access.
Variable:
Private currLimitedString As CLimitedString
Script library function:
Function GetLimitedStringInstance As Variant If (currLimitedString Is Nothing) Then Set currLimitedString = New CLimitedString End If Set GetLimitedStringInstance = currLimitedString End Function
As your class is private, this function must return Variant, as code using this class isn’t aware of class’ existence. The usage of the object remains the same.
How do I call my class?
It is quite simple. All you need to do is include your library into an agent for example and then do the following where needed:
... Dim vLimitedString As Variant ... vLimitedString = GetLimitedStringInstance vLimitedString.Limit = 10 Messagebox vLimitedString.Process ("My very first singleton class")
Leave a Reply