2008-09-30 11 views
5

El enlace de aquí enumera ([http://www.yoda.arachsys.com/csharp/singleton.html][1]) algunos patrones de singleton en C#. El artículo también describe lo obvio de que un singleton no está destinado a aceptar parámetros que "de lo contrario, una segunda solicitud de una instancia pero con un parámetro diferente podría ser problemático". Esto significa que cualquier parámetro que necesite para que la clase funcione debe inducirse como una propiedad.Patrones de singleton parametrizados

Tengo curiosidad por saber si hay algún patrón de diseño de singleton parametrizado. Aceptar valores como una propiedad no exige nada al consumidor.

Respuesta

3

Sobre la base de su pregunta, parece que puede estar buscando a un patrón Abstract Factory (crea una instancia de varias familias de clases) que mantiene una lista/diccionario interno de clases que ya han sido instanciado, imitando así el singleton funcionalidad del patrón.

A continuación, utilizaría esta clase de fábrica para solicitar un objeto en función de los parámetros que haya pasado, y si existe en su lista interna se devuelve, y si no, se crea una nueva instancia y luego se agrega al lista y regresó.

1

sus medios de que los parámetros que necesitan a conseguir el funcionamiento de la clase deben ser inducidos como una propiedad.

Lo ideal es que la clase singleton no dependa del código externo.

En caso de que necesite proporcionar información adicional al constructor singleton, puede simplemente crear un conjunto de objetos.

Puede ser una lista simple o cualquier otra estructura de datos adecuada. Tendrá que hacer que sea seguro para subprocesos (si es que importa) y garantizar que no habrá múltiples objetos instanciados con los mismos parámetros.

Básicamente, tendrá una fábrica de clases. Devolverá el mismo objeto para los mismos parámetros.

En este caso, tendrá N objetos individuales, es decir, los objetos con un estado diferente se tratarán como instancias completamente diferentes.

Puede encontrar ejemplos de tales singletons en contenedores de Inversion of Controls.

Por ejemplo, puede tener algún servicio que dependa de otros servicios. Cuando llamas a container.Get (tipo de servicio). El contenedor DI inicializará automáticamente la instancia del servicio con los parámetros requeridos y lo devolverá a la persona que llama. Pero esta instancia de servicio se convierte en singleton: no podrá crear otro servicio con los mismos parámetros.