|
| 1 | +--- |
| 2 | +title: Singleton |
| 3 | +category: Creational |
| 4 | +language: es |
| 5 | +tag: |
| 6 | + - Gang of Four |
| 7 | +--- |
| 8 | + |
| 9 | +## Propósito |
| 10 | + |
| 11 | +Asegurar que una clase solo tenga una instancia y proporcionar un punto de acceso global a ella. |
| 12 | + |
| 13 | +## Explicación |
| 14 | + |
| 15 | +Ejemplo del mundo real |
| 16 | + |
| 17 | +> Solo puede haber una torre de marfil donde los magos estudian su magia. La misma torre de marfil encantada |
| 18 | +> siempre es utilizada por los magos. La torre de marfil aquí es un singleton. |
| 19 | +
|
| 20 | +En otras palabras |
| 21 | + |
| 22 | +> Asegura que solo se cree un objeto de una clase en particular. |
| 23 | +
|
| 24 | +Wikipedia dice |
| 25 | + |
| 26 | +> En ingeniería de software, el patrón singleton es un patrón de diseño de software que limita la |
| 27 | +> instanciación de una clase a un solo objeto. Esto es útil cuando se necesita exactamente un objeto para |
| 28 | +> coordinar acciones en todo el sistema. |
| 29 | +
|
| 30 | + |
| 31 | +**Ejemplo programático** |
| 32 | + |
| 33 | +Joshua Bloch, Effective Java 2nd Edition p.18 |
| 34 | + |
| 35 | +> Un enum type con un solo elemento es la mejor forma de implementar un singleton |
| 36 | +
|
| 37 | +```java |
| 38 | +public enum EnumIvoryTower { |
| 39 | + INSTANCE |
| 40 | +} |
| 41 | +``` |
| 42 | + |
| 43 | +Luego, |
| 44 | + |
| 45 | +```java |
| 46 | + var enumIvoryTower1 = EnumIvoryTower.INSTANCE; |
| 47 | + var enumIvoryTower2 = EnumIvoryTower.INSTANCE; |
| 48 | + LOGGER.info("enumIvoryTower1={}", enumIvoryTower1); |
| 49 | + LOGGER.info("enumIvoryTower2={}", enumIvoryTower2); |
| 50 | +``` |
| 51 | + |
| 52 | +La salida de la consola |
| 53 | + |
| 54 | +``` |
| 55 | +enumIvoryTower1=com.iluwatar.singleton.EnumIvoryTower@1221555852 |
| 56 | +enumIvoryTower2=com.iluwatar.singleton.EnumIvoryTower@1221555852 |
| 57 | +``` |
| 58 | + |
| 59 | +## Diagrama de clases |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +## Aplicabilidad |
| 64 | + |
| 65 | +Utilice el patrón Singleton cuando: |
| 66 | + |
| 67 | +* Debe haber exactamente una instancia de una clase, y debe ser accesible para los clientes desde un punto de acceso conocido |
| 68 | +* Cuando la única instancia debe ser extensible mediante herencia, y los clientes deben poder usar una instancia extendida sin modificar su código |
| 69 | + |
| 70 | +Algunos casos típicos para Singleton: |
| 71 | + |
| 72 | +* La clase logging |
| 73 | +* Gestionar una conexión a una base de datos |
| 74 | +* Gestor de archivos |
| 75 | + |
| 76 | +## Usos conocidos |
| 77 | + |
| 78 | +* [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29) |
| 79 | +* [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--) |
| 80 | +* [java.lang.System#getSecurityManager()](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--) |
| 81 | + |
| 82 | + |
| 83 | +## Consecuencias |
| 84 | + |
| 85 | +* Viola el Principio de Responsabilidad Única (Single Responsibility Principle - SRP) al controlar su creación y ciclo de vida. |
| 86 | +* Fomenta el uso de una instancia compartida globalmente, lo que impide que un objeto y los recursos utilizados por este objeto se liberen. |
| 87 | +* Crea un código fuertemente acoplado. Los clientes del Singleton se vuelven difíciles de probar. |
| 88 | +* Hace casi imposible hacer subclases de un Singleton. |
| 89 | + |
| 90 | +## Créditos |
| 91 | + |
| 92 | +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) |
| 93 | +* [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb) |
| 94 | +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) |
| 95 | +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) |
0 commit comments