English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo comparte el código específico del patrón Singleton del diseño de Java, a disposición de todos para referencia, el contenido específico es el siguiente
Concepto:
Patrón Singleton: una clase tiene solo una instancia.
Una clase tiene solo una instancia y proporciona un punto de acceso global.
Las razones para usar este modelo son:
Cuando navegamos por sitios web, algunos sitios muestran "Número de personas en línea actual". Generalmente, la manera de implementar esta función es almacenar cada IP de inicio de sesión en una memoria, archivo o base de datos, y cada IP adicional realiza una "+1”, generalmente se realiza con un método, como add().+1La función de "+1Actualizar los datos en la base de datos, luego guardar; cuando se muestra en la página, obtener los datos almacenados en la base de datos a través de otro método. Pero, cuando varios usuarios se conectan simultáneamente, si cada uno tiene que new un objeto, luego llamar al método 'add()' a través de 'objeto.métodoNombre' y luego almacenar los datos en la base de datos, esto llevará a que varios usuarios no puedan registrar los datos del usuario de manera precisa en la base de datos. Por lo tanto, diseñar este contador como un objeto global (todos utilizan este objeto, en lugar de uno, new uno), todos comparten la misma información de datos, y se puede evitar problemas similares, esto es lo que se conoce como una aplicación del patrón Singleton.
Del mismo modo, también se encontrarán situaciones similares en otras escenas, utilizando ideas similares. Por ejemplo:
1. Recursos externos: Cada computadora tiene varios impresoras, pero solo puede haber un PrinterSpooler para evitar que dos tareas de impresión se envíen al mismo tiempo a la impresora. Recursos internos: La mayoría de los software tienen (o más de uno) archivo de propiedades para almacenar la configuración del sistema, tal sistema debe tener un objeto que gestione estos archivos de propiedades
2. El Administrador de Tareas de Windows (Task Manager) es un ejemplo muy典型 del patrón Singleton (¿es familiar, ¿no?), piensa, ¿puedes abrir dos windows task manager? No lo dudes, pruébalo tú mismo~
3. La Papelera de Reciclaje de Windows (Recycle Bin) es una aplicación de Singleton典型. Durante todo el proceso de ejecución del sistema, la Papelera de Reciclaje mantiene una única instancia.
4. El contador del sitio web generalmente también se implementa mediante el patrón Singleton, de lo contrario, es difícil de sincronizar.
5. La aplicación de registro de aplicaciones de aplicaciones generalmente utiliza el patrón Singleton para implementar, esto se debe a que el archivo de registro compartido siempre está abierto, porque solo puede haber una instancia que lo opere, de lo contrario, es difícil agregar contenido.
6. La lectura de objetos de configuración de aplicaciones web generalmente también aplica el patrón Singleton, esto se debe a que el archivo de configuración es un recurso compartido.
7. El diseño del pool de conexiones de la base de datos generalmente también utiliza el patrón Singleton, porque la conexión de la base de datos es un recurso de base de datos. En el sistema de software de base de datos, se utiliza el pool de conexiones de la base de datos para ahorrar la pérdida de eficiencia causada por abrir o cerrar la conexión de la base de datos, esta pérdida de eficiencia es muy costosa, por lo que mantenerla con el patrón Singleton puede reducir esta pérdida considerablemente.
8. El diseño del pool de hilos de la multitiempo generalmente también utiliza el patrón Singleton, esto se debe a que el pool de hilos debe facilitar el control de los hilos en el pool.
9. El sistema de archivos del sistema operativo, también es un ejemplo específico de implementación de patrón Singleton, un sistema operativo solo puede tener un sistema de archivos.
10. HttpApplication es un ejemplo típico de singleton. Aquellos que están familiarizados con el ciclo de vida completo de una solicitud de ASP.Net (IIS) deben saber que HttpApplication también es un patrón de singleton, todos los HttpModule comparten una instancia de HttpApplication.
En resumen, las aplicaciones generales del patrón de singleton son:
1. Objetos que se instancian y destruyen con frecuencia.
2. Objetos que consumen mucho tiempo o recursos en la creación, pero se utilizan con frecuencia.
3. Objetos de clase de herramienta con estado.
4. Objetos que acceden con frecuencia a la base de datos o los archivos.
5. Al compartir recursos, evita la pérdida de rendimiento o la pérdida causada por las operaciones de recursos. Por ejemplo, los archivos de registro, la configuración de la aplicación.
6. Facilita la comunicación entre recursos cuando se controlan los recursos. Por ejemplo, las piscinas de hilos.
Características:
1、La clase singleton puede tener solo una instancia;
2、La clase singleton debe crear su única instancia por sí misma;
3、La clase singleton debe proporcionar esta instancia a todos los otros objetos
Elementos del patrón de singleton:
1. Constructor privado
2. Referencia estática privada que apunta a su propia instancia
3. Método público estático que devuelve su propia instancia
Tres métodos para implementar el patrón de singleton:
1. El modo de hambriento: la instancia única se construye en el momento de la carga de la clase, inicialización apresurada (método de carga anticipada).
/** * Modo de hambriento (recomendado) * */ public class Test { private Test() { } public static Test instance = new Test(); public Test getInstance() { return instance; } }
Ventajas
1. Seguro en términos de hilos
2. Ya se ha creado un objeto estático en el momento de la carga de la clase, la velocidad de respuesta al llamar es rápida
Desventajas
La eficiencia de los recursos no es alta, es posible que getInstance() nunca se ejecute, pero si se ejecutan otros métodos estáticos de la clase o se carga la clase (class.forName), la instancia aún se inicializará.
2. El modo de perezoso: la instancia única se construye cuando se utiliza por primera vez, inicialización diferida.
class Test { private Test() { } public static Test instance = null; public static Test getInstance() { if (instance == null) { //Cuando múltiples hilos determinan que instance es null, se produce una repetición en la operación new. instance = new Singleton2() } return instance; } }
Ventajas
Evita la creación de instancias en el modo de hambriento sin necesidad, con una alta eficiencia de uso de recursos, no se crea una instancia si no se ejecuta getInstance(), y se pueden ejecutar otros métodos estáticos de la clase.
Desventajas
El modo de perezoso no presenta problemas en una sola hilera, pero cuando se accede simultáneamente desde múltiples hilos, es posible que se creen múltiples instancias simultáneamente, y estas instancias no son el mismo objeto, aunque las instancias creadas después cubrirán a las creadas primero, aún así, habrá situaciones en las que se obtendrá un objeto diferente. La solución a este problema es añadir el mecanismo de bloqueo synchronized, la primera carga no es rápida, y el costo de sincronización innecesario en el uso de múltiples hilos es grande.
3.doble comprobación
class Test { private Test() { } public static Test instance = null; public static Test getInstance() { if (instance == null) { synchronized (Test.class) { if (instance == null) { instance = new Test(); } } } return instance; } }
Ventajas
La utilización de recursos es alta, no se crea una instancia si no se ejecuta getInstance(), se pueden ejecutar otros métodos estáticos de esta clase
Desventajas
La reacción no es rápida al cargar por primera vez, debido a algunas razones del modelo de memoria de Java, a veces falla
4.clase interna estática
class Test { private Test() { } private static class SingletonHelp { static Test instance = new Test(); } public static Test getInstance() { return SingletonHelp.instance; } }
Ventajas
La utilización de recursos es alta, no se crea una instancia si no se ejecuta getInstance(), se pueden ejecutar otros métodos estáticos de esta clase
Desventajas
La reacción no es rápida al cargar por primera vez
Resumen:
Generalmente se utiliza el enfoque de hamster hambriento, si está muy preocupado por los recursos, puede usar la clase interna estática, no se recomienda usar el enfoque de hamster perezoso ni el doble comprobación
Esto es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos nos apoyen en el tutorial de grito.
Declaración: el contenido de este artículo se obtiene de la red, pertenece al autor original, el contenido se contribuye y carga espontáneamente por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado una edición humana y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.