Heredar de un Singleton
Miércoles 19 de Septiembre de 2007 a las 23:56En un post anterior ya hablé del patrón de diseño Singleton.
Una de las limitaciones de este patrón es la dificultad de crear una clase singleton base y crear varias clases derivadas o hijas que hereden de ella adquiriendo el comportamiento de la clase Padre, lo cual incluye además del comportamiento como singleton cualquier otra funcionalidad común que se desee añadir.
La dificultad parte del hecho de que si declaramos la variable Instancia como static (en C#) o shared (en VB.NET), dicha variable será compartida por todas las clases derivadas.
El problema de heredar de una clase singleton es que al pertenecer la instancia privada (declarada como shared en VB.NET y como static en C#) a la clase padre será compartida por todas las clases derivadas. Por lo que cuando en cada una de las clases derivadas hagamos el GetInstance obtendremos siempre la misma instancia de la misma clase derivada (que será la que realice el primer GetInstance que es donde se instancia dicha clase.
En este artículo se aporta una posible solución a este problema. Para ello realmente no se utiliza herencia sino Generics, aunque el resultado es similar y se da solución al problema planteado.
Las clases "derivadas" (que como ya hemos comentado realmente no heredan de la clase genérica) el único código adicional al que tuvieran que deben incorporar es declarar un constructor privado para evitar que sean instanciadas con lo que se vulneraría uno de los requisitos básicos del patrón singleton que es que solo puede existir una instancia de la clase.
-
Public Class SingletonGenerico(Of Tipo)
-
-
Private Sub New()
-
End Sub
-
-
Private Shared _instancia As Tipo
-
-
Public Shared ReadOnly Property Instancia() As Tipo
-
Get
-
If _instancia Is Nothing Then
-
_instancia = CType(Activator.CreateInstance(GetType(Tipo), True), Tipo)
-
End If
-
-
Return _instancia
-
End Get
-
End Property
-
-
End Class
La utilización de una clase "MiClase" que tuviera una propiedad llamada "PropiedadDeMiClase" y que hiciera uso de la clase genérica seria la siguiente:
-
ConfiguracionGenerica(Of MiClase).Instancia.PropiedadDeMiClase = "¡Funciona!"