Definición: Asegúrese de que una clase tenga solo una instancia, y la instancia misma y proporcione esta instancia a todo el sistema.
Tipo: Crear diagrama de clase de patrón de clase:
Puntos de conocimiento del diagrama de clases:
1. Los diagramas de clases se dividen en tres partes, nombre, atributos y métodos.
2. Información de comentarios que comienza con << y termina con >>
3. Modificador + representa público, - representa privado, # representa protegido, nada representa el paquete visible.
4. Los atributos o métodos subrayados representan estáticos.
5. Los amigos que no están familiarizados con la relación entre los objetos en el diagrama de clases pueden referirse al artículo: la relación entre clases en el patrón de diseño.
El modo singleton debe ser el modo más simple entre los 23 modos de diseño. Tiene los siguientes elementos:
Echemos un vistazo a un ejemplo simple:
paquete com.wolf.action; import java.util.hashmap; import java.util.map; public class Demo {public static void main (string args []) lanza InstanciationException, ilegalaccesexception, classnotFoundException {system.println (son.getinstance (). GetName ()); System.out.println ("Quién soy yo"); }} El hijo de clase extiende el padre {name de cadena privada = "hijo"; Final String class = "Demo"; cadena protegida getName () {return this.query ("aaa"); } public static son getInStance () lanza InstanciationException, ilegalAccessException, classnotFoundException {// Esta debe ser una ruta global, de lo contrario regresar (son) instancia ("com.wolf.action.son"); }} clase Padre {mapa estático privado <string, objeto> instancia = new HashMap <String, Object> (); Nombre de cadena privada = "Clase premium"; protegido void fatcher () {System.out.println ("Yo soy la clase principal"); } Consulta de cadena protegida (String SQL) {return sql + "se ha realizado"; } instancia de objeto estático público (string objname) lanza InstanciationException, ilegalAccessException, classNotFoundException {if (instance.get (objname) == null || } return instance.get (objname); }} El patrón singleton se divide en dos tipos de acuerdo con el momento de instanciar el objeto: uno es el singleton hambriento y el otro es el singleton perezoso. Cuando se carga la clase singleton, el singleton instancia un objeto a su propia referencia; El estilo perezoso instanciará el objeto solo cuando se llame al método de instancia. El código es el siguiente:
Caso individual de estilo hombre hambriento
clase pública Singleton {private static singleton singleton = new Singleton (); private singleton () {} public static singleton getInstance () {return singleton; }}Caso individual perezoso
Singleton de clase pública {Singleton Singleton static privado; private singleton () {} public static sincronizado sincronizado Singleton getInstance () {if (singleton == null) {singleton = new Singleton (); } return Singleton; }}Ventajas del modo Singleton:
Escenarios aplicables: debido a las ventajas anteriores del modo singleton, es un modo de diseño que se usa más comúnmente en la programación. Resumí lo que sé de escenarios adecuados para usar el modo singleton:
Notas en el modo singleton:
Alguna controversia sobre el patrón Singleton en Java:
Si un objeto en modo singleton no se usa durante mucho tiempo, ¿será recolectado por el recolector de basura JVM? Vi mucha información diciendo: si JVM no se usa un objeto Singleton en la memoria durante mucho tiempo, JVM lo considerará basura y se limpiará al realizar la recolección de basura. Soy escéptico sobre esta declaración. Mi propia opinión es: en el hotspot virtual Machine versión 1.6, el recolector de basura JVM no reciclará los objetos Singleton a menos que la conexión se hace referencia estáticamente a los objetos Singleton en el singleton se desconecte artificialmente.
Con respecto a esta controversia, el autor escribió un artículo separado para discutirlo. Si tiene diferentes opiniones o ha experimentado esto, ingrese el artículo Discusión del modelo Singleton: el modelo de singleton y la recolección de basura participan en la discusión.
¿Aparecerán varios singletons en un JVM?
En el caso de los sistemas distribuidos, se generarán múltiples cargadores de clase y se generarán múltiples singletons múltiples, lo que sin duda es cierto. Entonces, ¿se generará un singleton en el mismo JVM? Solo se puede obtener el mismo singleton utilizando el método getInstance () proporcionado por el singleton, a menos que se use el método de reflexión, se obtendrá un nuevo singleton. El código es el siguiente
Clase C = class.forname (singleton.class.getName ()); Constructor ct = c.getDeClaredConstructor (); ct.setAccessible (verdadero); Singleton Singleton = (Singleton) ct.newinstance ();
De esta manera, cada carrera producirá un nuevo objeto singleton. Por lo tanto, cuando use el modo singleton, tenga cuidado de no usar la reflexión para generar nuevos objetos singleton.
¿Es seguro el hilo Singleton Lazy?
Es principalmente algunas declaraciones en línea que el patrón de singleton perezoso es la sesión de hilos. Incluso agregar la palabra clave sincronizada al método de instanciación sigue siendo peligrosa. Sin embargo, después de codificar las pruebas, descubrí que después de agregar la palabra clave sincronizada para modificarla, aunque tiene un impacto parcial en el rendimiento, es segura de hilo y no instanciona múltiples objetos.
¿Hay solo dos tipos de modos singleton: estilos hambrientos y perezosos?
Singleton hambriento y singleton perezoso son solo dos métodos de patrones singleton relativamente principales y comúnmente utilizados. Teóricamente, cualquier patrón de diseño que pueda implementar solo una instancia de una clase se puede llamar patrón de singleton.
¿Se pueden heredar las clases de singleton?
Dado que el método de construcción es privado, no son heredables, pero muchos otros patrones de singleton pueden ser heredados, como singletons registrados.
¿Es mejor ser un singleton hambriento o un singleton perezoso?
En Java, el singleton hambriento es mejor que el perezoso singleton. En C ++, se usan solteros perezosos generalmente.
El patrón Singleton es relativamente simple, por lo que no daré una demostración de código de ejemplo aquí.