2010-04-06 57 views
14

¿Alguien puede decirme un buen ejemplo del patrón Singleton? También tengo una duda para preguntar: ¿Es la siguiente situación la del patrón singleton:Ejemplo de patrón Singleton

cuando tenemos muchas impresoras conectadas en LAN pero solo una impresora en cola?

+4

intente abrir varias ventanas de 'windows media player', creo que solo puede abrir una a la vez, es un singleton. – Rajat

+0

@all: Me ayudó mucho. Muchas gracias. :) – Supereme

Respuesta

7

Singleton es un patrón de software.

Here es un ejemplo en C#.

Tener una sola cola en una LAN es más un problema de diseño de hardware/red que un concepto de software, por lo que no es realmente aplicable. Si estaba modelando tal cosa en el software y tenía para asegurarse de que solo hay una cola, entonces sería aplicable.

6

Mi regla personal para el uso de conjuntos unitarios es que sólo se les utiliza cuando se trata de un error para que haya más de una instancia, y el acceso global es necesaria . Yo diría que una cola de impresión es por lo tanto no un buen candidato para singleton: porque no necesita acceso global, y también es discutible que es un error tener más de uno. De hecho, si bien puede haber una cola de impresión "física" (por ejemplo, en un servidor de impresión en alguna parte) que no es lo que le importa la aplicación sobre, sólo tiene que presentar "trabajos":

PrintJobScheduler pjs; 
pjs.SubmitPrintJob(myPrintJob); 

que no es necesario mi imaginario PrintJobScheduler es un singleton, aunque puede estar hablando con un servicio "singleton" en algún lugar de la red.

1

El patrón Singleton controla la creación del objeto. Garantiza que en un punto dado de tiempo solo esté presente 1 objeto. Es más fácil de implementar, pero puede ser peligroso.

  1. La GC de tales objetos es difícil.
  2. difícil de probar

No creo cola de impresión es un patrón Singleton.

1

Uno de los mejores ejemplos (en la vida real) del patrón de Singleton que he visto es la agrupación de conexiones SQL en .NET.

Si desea ver el código, tendrá que abrir Reflector ... pero el Singleton realiza un seguimiento de todas las conexiones disponibles y las distribuye a medida que están disponibles.

En cuanto a su ejemplo, es un poco vago. La cola de documentos en cada impresora individual podría ser un mejor ejemplo. A medida que los documentos llegan a la impresora, se ponen en la cola. Cada proceso que se ejecuta en la impresora toma un documento de la cola de Singleton (en lugar de crear su propia cola para el hilo).

+0

Personalmente, y sin haber visto el conjunto de conexiones de SQL .NET, preferiría tener diferentes grupos para diferentes bases de datos, diferentes modos de acceso (solo lectura, lectura/escritura) y usuarios, e incluso para diferentes prioridades. Entonces: un conjunto de grupos, es decir, no singleton. – digitalarbeiter

4

La idea general detrás de un singleton es que es un objeto para el que no tiene sentido tener más de uno, y que puede tener que acceder a todo su programa.

El que termino usando todo el tiempo es un programa configuración.

Uno de mis singletons de configuración típica contendrá cosas como direcciones IP, nombres de dispositivos y límites del sistema. Cuando se invoca por primera vez, generalmente leerá un archivo de configuración (a veces y/o el registro del sistema en Windows) y cargará los valores predeterminados para los elementos que no se encuentran allí. Realmente no tiene sentido que un programa tenga múltiples configuraciones, por lo que todo esto solo debe leerse una vez para todo el programa. Además, puede ser necesario acceder a los elementos de configuración mediante todo tipo de clases diferentes que, de lo contrario, no estarían relacionadas en el sistema.

+0

Creo que la palabra clave estática es más útil en este tipo de escenario. ¿Que dices? –

+0

@NIVESHSENGAR - Francamente, comencé a estar del lado de aquellos que creen que Singleton es un antipatrón. (http://caines.ca/blog/programming/singletons-anti-pattern-or-worst-anti-pattern-ever/) Ahora me gusta hacer configuraciones de objetos, propiedad del programa principal y construidas en un objeto que los requiera . –

2

Una respuesta HTTP podría ser un buen ejemplo. No desea tener dos o más instancias enviando encabezados contradictorios.

4

En el diseño del juego, si tiene un controlador de dispositivo gráfico o una abstracción de hardware similar que es responsable de un solo recurso como el renderizado o el audio, entonces debe ser un singleton.

Al menos that's what I was told.

2
class Singleton 
{ 
    #region Subj Implementation 

    private Singleton() { } 
    private static readonly Lazy<Singleton> _lazyInit = new Lazy<Singleton> 
     (() => new Singleton()); 
    public static Singleton Instance { get { return _lazyInit.Value; } } 

    #endregion 
} 
2

si tengo un montón de películas en una carpeta i Seleccionar todo y pulse enter entonces más de una instancia de jugador (el que está utilizando por ejemplo, reproductor de medios) se crean lo que se traduce en uso de recursos, por lo que debe haber un patrón de diseño singelton para crear solo una instancia.

2

Algunos de los ejemplos que figuran en this artículo sobre el patrón de singleton.

+2

Tenga en cuenta que se desaconsejan las respuestas de solo enlace, las respuestas SO deberían ser el punto final de una búsqueda de una solución (frente a otra escala más de referencias, que tienden a quedarse obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

+1

La URL dada no funciona. Recomiendo encarecidamente no hacer clic en él. – arsho

-1
class singleton{ 

    public static singleton obj = null;  
    protected singleton(){ } 

    public static singleton getObj(){   
     if(obj == null){     
       obj = new singleton();    
      }   
     return obj;  
    }  
} 

public class First { 
    public static void main(String[] args) {  
     singleton ss = singleton.getObj();  
    } 
} 
Cuestiones relacionadas