Red de conocimiento informático - Computadora portátil - Cómo utilizar el patrón singleton de C#

Cómo utilizar el patrón singleton de C#

1. ¿Qué es un singleton?

El modo singleton (Singleton) es el más opuesto a varios modos de creación. Su característica principal no es generar nuevas instancias basadas en llamadas al programa del usuario, sino controlar una cierta unicidad. de una instancia de tipo De la figura anterior, sabemos que solo contiene un rol, es decir, un singleton, que tiene un constructor privado. Tiene un constructor privado, lo que garantiza que los usuarios no puedan crear instancias directamente a través de new. Además de esto, el patrón también contiene una instancia de variable miembro privada estática y un método público estático Instance(), que es responsable de verificarlo e instanciarlo y luego almacenarlo en la variable miembro estática para garantizar que solo se cree una instancia.

Rol: el modo de instancia única está diseñado para garantizar que solo haya una instancia de una clase específica en un momento dado del ciclo de vida de la aplicación y para proporcionar un punto de acceso global para que los programas cliente la obtengan. instancia.

2. Tres métodos de escritura

2.1. Modo clásico:

clase pública Singleton

{ instancia privada Singleton estática ( )

{

} Singleton estático público GetInstance()

{ if(instancia==null)

{

instancia=new Singleton();

} instancia de retorno;

}

}

}

En este modo clásico, no se considera el problema de que los subprocesos adquieran instancias al mismo tiempo, es decir, dos subprocesos pueden adquirir la instancia al mismo tiempo. Cuando está vacía, dos subprocesos crearán instancias por separado. Por lo tanto, es necesario modificar el código anterior.

2.2 Modo Singleton en subprocesos múltiples

clase pública Singleton

{ instancia privada estática de Singleton; objeto estático privado _lock=new object(); )

{

} Singleton estático público GetInstance()

{ if(instancia==null)

{ lock(_lock)

{ if(instancia==null)

{

instancia=new Singleton();

}

}

}

} instancia de devolución;

}

}

}

El código anterior utiliza el método de doble bloqueo para resolver mejor el problema de la implementación singleton de subprocesos múltiples. Echemos un vistazo al bloque if interno, que se utiliza con una operación de bloqueo para garantizar que solo un hilo pueda acceder al bloque, por lo que solo se crea una instancia. Echemos un vistazo al bloque de declaración if externo. Hace que sea innecesario que cada hilo se bloquee cada vez que se adquiere una instancia, porque solo cuando la instancia está vacía (es decir, es necesario crear una instancia), es necesario bloquearla y Si ya existe una instancia, devuelva la instancia directamente, ahorrando gastos generales de rendimiento.

2.3 Modo de inanición

Clase pública sellada Singleton

{ instancia de Singleton de solo lectura estática privada=new Singleton() Private Singleton()

{

} Singleton estático público GetInstance()

{ instancia de retorno;

}

}

La palabra clave readonly utilizada anteriormente se puede usar junto con static para especificar una constante como nivel de clase, cuya inicialización la realiza un constructor estático y se puede compilar en tiempo de ejecución. En este modo, no necesitamos resolver los problemas de seguridad de subprocesos nosotros mismos, CLR lo resolverá por nosotros. Se puede ver que se crea una instancia de la clase automáticamente durante la carga, en lugar de crear una instancia del único objeto singleton después de la primera llamada a GetInstance().

3. Ventajas del modo singleton

El modo singleton puede controlar el número de objetos instanciados, garantizando así que el acceso al objeto sea único.

Control de instancia: el patrón singleton evita que otros objetos se creen instancias, garantizando así que todos los objetos accedan a una única instancia.

Extensibilidad: debido a que el proceso de creación de instancias está controlado por la propia clase, la clase se expandirá en consecuencia cuando se cambie el proceso de creación de instancias.

4. Desventajas del modo de instancia única:

Sobrecarga del sistema. Aunque la sobrecarga parece pequeña, cada vez que hace referencia a una instancia de la clase, debe verificar si la instancia existe. Este problema se puede solucionar con instancias estáticas.

Desarrollar ofuscación. Cuando se trabaja con objetos de patrón Singleton (especialmente aquellos definidos en una biblioteca de clases), los desarrolladores deben recordar no usar la nueva palabra clave para crear una instancia del objeto. Debido a que los desarrolladores no pueden ver el código fuente en una biblioteca de clases, se sorprenden cuando descubren que no pueden crear instancias de una clase.

Ciclo de vida del objeto. El patrón singleton no recomienda destruir objetos. En los lenguajes de desarrollo que proporcionan administración de memoria (como los basados ​​en .NetFramework), solo el objeto de patrón singleton en sí puede destruir una instancia de objeto, porque solo él contiene una referencia a la instancia. En varios lenguajes de desarrollo (como C++), otras clases pueden destruir instancias de objetos, pero al hacerlo se generarán punteros desconocidos dentro de la clase singleton.

5. Aplicabilidad singleton

Existe una condición necesaria para usar el modo singleton: cuando el sistema requiere que una clase solo pueda tener una instancia, se debe usar el modo singleton. Por el contrario, si pueden existir varias instancias de una clase, no utilice el patrón singleton.

No utilice el modo singleton para acceder a variables globales. Esto anula el propósito del patrón singleton y es mejor ubicarlo en un miembro estático de la clase correspondiente.

No configure la conexión de la base de datos como singleton, porque el sistema puede tener múltiples conexiones a la base de datos y, cuando el grupo de conexiones esté disponible, la conexión debe liberarse lo antes posible.