Pregunta

En nuestra capa de acceso a datos en el trabajo tenemos esta implementación estándar en la que se accede a la clase a través de una propiedad pública singleton que se parece a esto:

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

ahora, entiendo lo que hace el código, pero me preguntaba por qué haría esto simplemente creando una instancia de la clase cada vez que se usa.

¿Fue útil?

Solución

EDIT: Oh, Dios mío, no detecté las " Capas de acceso a datos " parte. Pero también tengo un ejemplo de eso: si su aplicación de multiproceso difunde todas sus llamadas a la base de datos a través de una clase singleton, solo un subproceso accederá a la base de datos a la vez, evitando las condiciones de carrera.

Si tiene un mecanismo de registro en una aplicación de subprocesos múltiples que utiliza para escupir todas las excepciones y simplemente escribir información (especialmente para servicios o aplicaciones que siempre se están ejecutando, imprimiendo estados cada vez que ocurran cosas), ejecutar en problemas de bloqueo de archivos. Utilizo una clase de registrador de singleton, de modo que solo un hilo tendrá acceso al registrador, y el resto esperará hasta que el registrador tenga libertad para escribir su línea en el archivo de texto.

Hay muchas razones geniales para usar un singleton, pero yo era como tú y no tenía idea de para qué eran hasta que encontré este problema con el acceso a archivos en una aplicación multiproceso.

Otros consejos

Si lo desea, también puede hacer esto, ya que su doble control de bloqueo acelerará el acceso a su singleton

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }

La respuesta es bastante simple: desea obtener el objeto mismo cada vez que se usa.

Le brinda las ventajas de ser una variable global (es decir, solo hay una) con las ventajas de ser un objeto de clase (entre otras cosas, puede hacer una inicialización invisible la primera vez que se necesita).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top