User Tools

Site Tools


wiki:pdd_2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
wiki:pdd_2 [2024/09/02 01:11] adminwiki:pdd_2 [2024/09/02 01:16] (current) admin
Line 50: Line 50:
 </code> </code>
  
 +Primero, esta clase tiene un constructor por defecto privado. De este modo, ocurrirá un error de compilación cuando cualquier código fuera de la clase intente llamar a ''new Logger()''. Además, un atributo estático almacena la única instancia de la clase. Cuando necesitemos esta instancia, debemos llamar al método público y estático ''getInstance()''. A continuación, se muestra un ejemplo:
 +
 +
 +<code java>
 +
 +void f() {
 +  Logger log = Logger.getInstance();
 +  log.println("Ejecutando f");
 +  ...
 +}
 +
 +void g() {
 +  Logger log = Logger.getInstance();
 +  log.println("Ejecutando g");
 +  ...
 +}
 +
 +void h() {
 +  Logger log = Logger.getInstance();
 +  log.println("Ejecutando h");
 +  ...
 +}
 +</code>
 +
 +En este nuevo código, estamos seguros de que las tres llamadas a ''getInstance'' devuelven la misma instancia de ''Logger''. Todas las mensajes se registrarán usando esta instancia.
 +
 +Entre los patrones de diseño propuestos en el libro de la Gang of Four, el Singleton es el más polémico y criticado. La razón es que puede ser utilizado para camuflar la creación de variables y estructuras de datos globales. En nuestro caso, la instancia única de ''Logger'' es, en la práctica, una variable global que puede ser leída y modificada en cualquier parte del programa. Para ello, basta con llamar a ''Logger.getInstance()''. Las variables globales representan una forma de acoplamiento no aceptable (o fuerte) entre clases, es decir, una forma de acoplamiento que no está mediada a través de interfaces estables. Sin embargo, en el caso de ''Logger'', el uso de Singleton no genera preocupaciones, ya que es exactamente el recurso recomendado por el patrón: tenemos un recurso que es único — un archivo de registro, en este caso — y queremos reflejar esta característica en el diseño, garantizando que sea manipulado a través de una clase que, por construcción, tendrá como máximo una instancia.
 +
 +En resumen: el Singleton debe ser usado para modelar recursos que, conceptualmente, deben tener como máximo una instancia durante la ejecución de un programa. Por otro lado, un uso abusivo del patrón ocurre cuando se adopta como un artificio para la creación de variables globales.
 +
 +Por último, hay una crítica adicional al uso de Singletons: complican la prueba automática de métodos. La razón es que el resultado de la ejecución de un método puede depender ahora de un estado global almacenado en un Singleton. Por ejemplo, supongamos un método ''m'' que retorna el valor de ''x + y'', donde ''x'' es un parámetro de entrada y ''y'' es una variable global, que forma parte de un Singleton. Así, para probar este método necesitamos proporcionar el valor de ''x'', lo cual es bastante fácil, ya que es un parámetro del método. Pero también necesitamos garantizar que ''y'' tendrá un valor conocido, lo cual puede ser más difícil, ya que es un atributo de otra clase.
  
wiki/pdd_2.1725253888.txt.gz · Last modified: 2024/09/02 01:11 by admin