JavaRush /Blog Java /Random-ES /Patterns y Singleton: para todos los que los encontraron ...

Patterns y Singleton: para todos los que los encontraron por primera vez

Publicado en el grupo Random-ES
Este artículo está dirigido a aquellos que se encontraron por primera vez con el concepto de patrones, escucharon sobre Singletonél o de alguna manera lo hicieron, pero aún no entendieron nada. ¡Bienvenido! Los estudiantes de JavaRush encuentran patrones por primera vez en el nivel 15, cuando inesperadamente el límite pide "arreglar" e implementar un patrón Singletoncon una implementación diferida. Los estudiantes que escuchan sobre esto por primera vez Singletoninmediatamente tienen un montón de preguntas: qué es un patrón, por qué es necesario, qué tipo de patrón es Singletony, finalmente, qué tipo de implementación diferida es esta. Empecemos a responder en orden: Patrones y Singleton - para todos los que los encontraron por primera vez - 1

¿Qué es un patrón de todos modos?

Para una mejor comprensión, creo que vale la pena responder esta pregunta de la historia. Entre los programadores se encuentran cuatro autores tan famosos: Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides, a quienes se les ocurrió una idea interesante.
Patrones y Singleton - para todos los que los encontraron por primera vez - 2
Se dieron cuenta de que al escribir programas a menudo tenían que resolver aproximadamente los mismos problemas y escribir código con la misma estructura. Por lo tanto, decidieron describir en forma de patrones los patrones típicos que se utilizan a menudo en la programación orientada a objetos. El libro fue publicado en 1995 con el título “Técnicas de diseño orientado a objetos. Patrones de diseño" . El título del libro resultó ser demasiado largo y simplemente pasó a ser conocido como El libro de la banda de los cuatro . En la primera edición se publicaron 23 patrones, tras lo cual se descubrieron decenas más. Entonces, respondiendo a la pregunta de este párrafo, “¿Qué son los patrones?” , resumamos en unas pocas palabras:
Un patrón es una solución estandarizada a un problema común.
Y Singletoneste es sólo uno de estos patrones.

¿Por qué necesitamos patrones (patrones de diseño)?

Puedes programar sin conocer patrones; puedes verificar esto simplemente dándote cuenta de que en el nivel 15 de JavaRush habías escrito cientos de miniprogramas sin saber nada sobre su existencia. Esto sugiere que un patrón es un tipo de herramienta cuya presencia distingue a un maestro de un aficionado:
Patrones y Singleton - para todos los que los encontraron por primera vez - 3
Los patrones describen cómo resolver correctamente uno de los problemas típicos. Como resultado, conocer los patrones le ahorra tiempo. Se puede hacer una analogía con los algoritmos. Por ejemplo, puedes crear tu propio algoritmo de clasificación con blackjack y números y dedicarle mucho tiempo, o puedes utilizar uno que ya se describió hace mucho tiempo e implementarlo. Lo mismo ocurre con los patrones. Además, con el uso de patrones, el código se vuelve más estandarizado y, al utilizar los patrones correctos, será menos probable que cometas errores, ya que ya fueron previstos y eliminados en este patrón. Bueno, además de todo, el conocimiento de los patrones permite a los programadores entenderse mejor entre sí. Simplemente decir el nombre de la plantilla es suficiente, en lugar de intentar explicar a tus compañeros programadores lo que quieres que hagan. Entonces, para resumir, los patrones de diseño ayudan a:
  • no reinventar la rueda, sino utilizar soluciones estándar;
  • estandarizar código;
  • estandarizar la terminología;
Como conclusión de esta sección, observamos que toda la variedad de patrones se puede simplificar en tres grandes grupos:
Patrones y Singleton - para todos los que los encontraron por primera vez - 4

Finalmente un patrón Singleton

SingletonSe refiere a patrones generativos . Su traducción literal es solitaria. Este patrón garantiza que una clase tenga solo un objeto (una instancia de la clase) y que se proporcione un punto de acceso global a ese objeto. De la descripción debe quedar claro que este patrón debe usarse en dos casos:
  1. cuando no se debe crear más de un objeto de cualquier clase en su programa. Por ejemplo, en un juego de computadora tienes una clase de “Personaje”, y esta clase debe tener solo un objeto que describa al personaje en sí.

  2. cuando necesita proporcionar un punto de acceso global a un objeto de clase. En otras palabras, debe asegurarse de que el objeto se llame desde cualquier parte del programa. Y, por desgracia, para esto no basta con crear una variable global, porque no está protegida contra escritura y cualquiera puede cambiar el valor de esta variable y se perderá el punto de acceso global al objeto. Estas propiedades Singletonson necesarias, por ejemplo, cuando tiene un objeto de una clase que funciona con una base de datos y necesita que la base de datos sea accesible desde diferentes partes del programa. Y Singletongarantizará que ningún otro código haya reemplazado la instancia de la clase creada previamente.
Estos dos problemas se resuelven así Singleton: debe haber un solo objeto en el programa y debe haber acceso global a él. En el ejemplo del nivel 15, el límite solicita implementar este patrón para la siguiente tarea (aquí está su descripción):
Patrones y Singleton - para todos los que los encontraron por primera vez - 5
Después de leer detenidamente la condición, queda claro por qué Singletonse necesita exactamente (Único) aquí. Después de todo, el programa te pide que crees un objeto de cada clase: Sun, Moon, Earth. Y es lógico suponer que cada clase del programa no debería crear más de un Sol/Luna/Tierra, de lo contrario sería absurdo, a menos, por supuesto, que estés escribiendo tu propia versión de Star Wars. Característica de la implementación Singletonde Java en tres pasos El comportamiento Singleton en Java no se puede implementar utilizando un constructor normal porque el constructor siempre devuelve un nuevo objeto. Por lo tanto, todas las implementaciones de Singleton'a se reducen a ocultar el constructor y crear un método estático público que controlará la existencia de un único objeto y "destruirá" todos los objetos que aparecen recientemente. Si Singletonse llama a 'a, debe crear un nuevo objeto (si aún no está en el programa) o devolver uno que ya haya sido creado. Para hacer esto: #1. – Debes agregar un campo estático privado a la clase que contiene un solo objeto:
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance; //#1
}
#2. – Hacer que el constructor de la clase (constructor predeterminado) sea privado (para que el acceso a él esté cerrado fuera de la clase, entonces no podrá devolver nuevos objetos):
public class LazyInitializedSingleton {
	private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){} // #2
}
#3 . – Declarar un método de creación estático que se utilizará para obtener el singleton:
public class LazyInitializedSingleton {
    private static LazyInitializedSingleton instance;
        private LazyInitializedSingleton(){}
        public static LazyInitializedSingleton getInstance(){ // #3
        if(instance == null){		//si el objeto aún no ha sido creado
            instance = new LazyInitializedSingleton();	//crear un nuevo objeto
        }
        return instance;		// devuelve el objeto creado previamente
    }
}
El ejemplo anterior es algo torpe, porque simplemente ocultamos el constructor y proporcionamos nuestro propio método en lugar del constructor estándar. Dado que este artículo tiene como objetivo permitir a los estudiantes de JavaRush entrar en contacto con este patrón (y los patrones en general) por primera vez, no se brindarán aquí las características de implementación de Singletons más complejos. Sólo observamos que dependiendo de la complejidad del programa, es posible que sea necesario un refinamiento más detallado de este patrón. Por ejemplo, en un entorno de subprocesos múltiples (consulte el tema Subprocesos), varios subprocesos diferentes pueden llamar simultáneamente al método getter de Singleton y el código descrito anteriormente dejará de funcionar, porque cada subproceso individual podrá crear múltiples instancias de la clase. En seguida. Por lo tanto, todavía existen varios enfoques diferentes para crear singletons seguros para subprocesos correctos. Pero esa es otra historia =) Y por último. ¿Qué es la inicialización diferida que solicitó el límite ? La inicialización diferida también se llama inicialización diferida. Esta es una técnica de programación en la que una operación que requiere un uso intensivo de recursos (y la creación de un objeto es una operación que requiere un uso intensivo de recursos) se realiza bajo demanda, en lugar de por adelantado. Que es básicamente lo que sucede en nuestro código Singleton'a. Es decir, nuestro objeto se crea en el momento en que se accede a él, y no con antelación. No se debe suponer que el concepto de inicialización diferida esté de alguna manera estrictamente relacionado con Singleton'om. La inicialización diferida también se usa en otros patrones de diseño generativo, por ejemplo en Proxy y Factory Method, pero esa es otra historia =) Se utilizaron las siguientes fuentes para preparar el artículo:
  1. Mejores prácticas del patrón de diseño Java Singleton con ejemplos
  2. Patrones de diseño
  3. Corregir Singleton en Java
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION