Heredar de un Singleton

En 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.

 

VB.NET:
  1. Public Class SingletonGenerico(Of Tipo)
  2.  
  3.     Private Sub New()
  4.     End Sub
  5.  
  6.     Private Shared _instancia As Tipo
  7.  
  8.     Public Shared ReadOnly Property Instancia() As Tipo
  9.         Get
  10.             If _instancia Is Nothing Then
  11.                 _instancia = CType(Activator.CreateInstance(GetType(Tipo), True), Tipo)             
  12.             End If
  13.  
  14.             Return _instancia
  15.         End Get
  16.     End Property
  17.  
  18. 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:

 

VB.NET:
  1. ConfiguracionGenerica(Of MiClase).Instancia.PropiedadDeMiClase = "¡Funciona!"

 

Leave a Reply

Antispam. Escriba la palabra 'hola' (sin comillas)