2010-08-10 25 views
6

Tengo un poco de clase, es un singleton, tenemos esta clase en varias aplicaciones y se usa allí como singleton.varias instancias de la clase singleton

Ahora estoy escribiendo una nueva aplicación y necesito varias instancias de esa clase, ¿cuál es la mejor práctica para tener varias instancias de la misma?

Al derivar de ello y hacer que la construcción privada sea pública, ¿trabajo con C#?

¿O puede haber alguna otra idea aquí?

Gracias

+7

@ André Pena: por favor, no use etiquetas para insultar a las personas o sus preguntas. – BoltClock

+0

Caso raro. Por favor, aclara la situación. La mejor solución es evitar singletons ... – Shlomo

+1

La "mejor práctica" en este caso es aprender de ello: su singleton nunca debería haber sido un singleton en primer lugar. Recuerda que la próxima vez que tengas la tentación de convertir algo en singleton. – jalf

Respuesta

12

Se supone que solo hay un Singleton. Si tienes más de uno, no es un Singleton.

¿Quizás es Multiton lo que quieres?

+0

+1 ¡Nunca escuché sobre ese patrón! Parece muy interesante. – BoltClock

+0

Esto es exactamente lo que necesito, nunca lo escuché. –

+1

Singleton significa una instancia por ______ (clave u otros criterios). El patrón de multitones no incluye nada que el patrón singleton no incluya. El artículo de Wikipedia coincide: "La mayoría de las personas y los libros de texto consideran que se trata de un patrón único". –

13

Simple: no lo haga un singleton. La palabra 'soltero' está ahí por una razón.

4

Me parece que si necesita varias instancias de esta clase, la manejaría como cualquier otra y eliminaría cualquier elemento de la clase que lo fuerce a ser un singleton, lo cual simplemente dejaría de serlo. ser un singleton

3

Puede considerar una clase de fábrica configurable para devolver siempre la misma instancia o darle diferentes instancias en función de la configuración u otros criterios.

+0

Me gustó su respuesta, pero el multitón es exactamente lo que necesito. –

0

Lo que estás pidiendo es muy contradictorio. ¿Podrías definir a qué te refieres con Singleton para asegurarte de que no usamos un vocabulario diferente?

Si el objeto existente es un singleton estático verdadero, es probable que no pueda instanciar instancias múltiples; para hacerlo necesitarías cargar cada instancia (y sus llamadas) en su propio AppDomain que no es trivial y sería un tradeoff/hack terriblemente grande solo para obtener varios Singletons.

1

Realmente depende de cómo exactamente se implementa la clase como singleton.

Si la clase tiene un constructor predeterminado privado y la instancia singleton se crea mediante un método de fábrica estático, su única opción es derivar de la clase (siempre que no esté sellada) y proporcionar un constructor público en la clase derivada para crear instancias múltiples

Si la clase tiene un constructor público, y el uso de singleton es solo una guía, pero no se aplica, puede simplemente crear tantas instancias como tenga.

Sin embargo, tenga en cuenta que si la clase se diseñó como singleton, es bastante probable que su implementación haga esa suposición internamente, por lo que tener varias instancias podría tener efectos secundarios inesperados. Deberías asegurarte de que la clase esté implementada, de modo que permita ese escenario de uso.

1

Un Singleton es un patrón de diseño que ofrece dos garantías:

  • que exactamente va a existir una instancia de la clase, y
  • que esta instancia es accesible a nivel mundial.

Si elimina el primer requisito, lo que tiene ya no es un singleton. Es un simple, pasado de moda global.

Así que llámalo por su nombre real. Lo que necesitas es una variable global simple. Puede envolverlo en algún tipo de lógica de inicialización lenta si lo necesita, pero es un proceso global, no un singleton.

Aparte de esto, Singletons are a really really bad idea. No los use en primer lugar.

Cuestiones relacionadas