Patrón multiton


De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda
Diagrama UML del multiton
Diagrama UML del multiton

En ingeniería de software , el patrón multiton es un patrón de diseño que generaliza el patrón singleton . Mientras que el singleton permite que se cree solo una instancia de una clase, el patrón multiton permite la creación controlada de múltiples instancias, que gestiona mediante el uso de un mapa .

En lugar de tener una sola instancia por aplicación (por ejemplo, el java.lang.Runtimeobjeto en el lenguaje de programación Java ), el patrón multiton asegura una sola instancia por clave .

La mayoría de las personas y los libros de texto consideran que este es un patrón singleton [ cita requerida ] . Por ejemplo, multiton no aparece explícitamente en los patrones de diseño del libro de texto de programación orientada a objetos de gran prestigio (aparece como un enfoque más flexible llamado registro de singletons ).

Descripción

Si bien puede parecer que el multiton es una tabla hash con acceso sincronizado, existen dos distinciones importantes. Primero, multiton no permite a los clientes agregar asignaciones. En segundo lugar, multiton nunca devuelve una referencia nula o vacía; en su lugar, crea y almacena una instancia multiton en la primera solicitud con la clave asociada. Las solicitudes posteriores con la misma clave devuelven la instancia original. Una tabla hash es simplemente un detalle de implementación y no el único enfoque posible. El patrón simplifica la recuperación de objetos compartidos en una aplicación.

Dado que el grupo de objetos se crea solo una vez, al ser un miembro asociado con la clase (en lugar de la instancia), el multiton conserva su comportamiento plano en lugar de evolucionar hacia una estructura de árbol .

El multiton es único porque proporciona acceso centralizado a un solo directorio (es decir, todas las claves están en el mismo espacio de nombres, per se ) de multiton, donde cada instancia de multiton en el grupo puede existir con su propio estado . De esta manera, el patrón aboga por el almacenamiento indexado de objetos esenciales para el sistema (tal como lo proporcionaría un sistema LDAP , por ejemplo). Sin embargo, un multiton está limitado a un uso amplio por parte de un solo sistema en lugar de una miríada de sistemas distribuidos.

Inconvenientes

Este patrón, como el patrón Singleton , hace que las pruebas unitarias sean mucho más difíciles, [1] ya que introduce el estado global en una aplicación.

Con los lenguajes de recolección de basura, puede convertirse en una fuente de pérdidas de memoria, ya que introduce fuertes referencias globales a los objetos.

Implementaciones

En Java, el patrón multiton se puede implementar utilizando un tipo enumerado , con los valores del tipo correspondientes a las instancias. En el caso de un tipo enumerado con un solo valor, esto da el patrón singleton.

En C #, también podemos usar enumeraciones, como muestra el siguiente ejemplo:

usando el  sistema ;utilizando  System.Collections.Generic ;public  enum  MultitonType{ cero , uno , Dos} clase  pública Multiton{  Diccionario privado estático de  solo lectura  < MultitonType , Multiton > ejemplares =    nuevo  Diccionario < MultitonType ,  Multiton > ();  tipo privado MultitonType  ; privado  Multiton ( tipo MultitonType  ) { esto . tipo  =  tipo ; } pública  estática  Multiton  GetInstance ( MultitonType  tipo ) { // Lazy init (no es seguro para subprocesos como está escrito) // Recomendamos usar Double Check Locking si necesita seguridad para roscas if  (! instance . TryGetValue ( type ,  out  var  instance )) { instancia  =  nuevo  Multiton ( tipo ); instancias . Agregar ( tipo ,  instancia ); }  instancia de retorno ; }  cadena de anulación  pública ToString ()  { return  "Mi tipo es"  +  esto . tipo ; } // Uso de muestra  vacío estático  público Main ()  { var  m0  =  Multiton . GetInstance ( MultitonType . Zero ); var  m1  =  Multiton . GetInstance ( MultitonType . Uno ); var  m2  =  Multiton . GetInstance ( MultitonType . Dos ); Consola . WriteLine ( m0 ); Consola . WriteLine ( m1 ); Consola . WriteLine ( m2 ); }}

Referencias

enlaces externos