Doubleton Design Pattern

Enero 14, 2008 at 9:44 am (Sobre diseño)

Para estrenar una nueva sección en este blog, escribo sobre el patrón de diseño “Doubleton”. La sección “sobre diseño” está orientada a analizar el diseño de sistemas informáticos desde una perspectiva grotesca, y desde el limite que separa lo utilizable de lo completamente inútil. Pero en el improbable caso de que alguna de estas diserciones realmente vislumbre un aspecto no conocido del diseño de sistemas, por favor, no olvidarse del autor.

El patrón de diseño Doubleton, también conocido como patrón YinYang tiene como propósito restringir el instanciamiento de una clase a solo dos objetos, en contraste con el patrón Singleton que solo permite una instancia.

Su uso es aplicable donde una enumeración (tipo nativo de dato que permite una lista enumerada de constantes) no es suficiente para suplir las necesidades semánticas y sintácticas que la abstracción buscada requiere. O sea, cuando las circunstancias requieren que los dos valores posibles funcionen como objetos, ya sea para asignarles operaciones y/o métodos o para asegurar legibilidad y tipado seguro.

La implementación de una clase Doubleton debe restringir el instanciamiento de la misma manera que lo hace el patrón Singleton, pero, a diferencia de este, no tiene un getter estático único y genérico. La implementación tiene dos getters estáticos cuya denominación depende de la semántica utilizada. Un ejemplo clásico de esto es el tipo de dato booleano:

| class Boolean {
|     ...
|     static Boolean getTrue() { ... }
|     static Boolean getFalse() { ... }
|     ...
| }

A su vez, la implementación provee un método para obtener el opuesto de una de las instancias, que efectivamente provee la otra instancia del Doubleton:

| class X {
|     ...
|     X getOpposite() { ... }
|     ...
| }

Métodos y operadores adicionales deben suplirse con el propósito de proveer una interfaz que promueva la legibilidad. Por ejemplo, en el caso de la abstracción de un dato booleano es conveniente proveer las operaciones booleanas básicas:

| class Boolean {
|     ...
|     static Boolean not(Boolean boolean) { ... }
|     Boolean and(Boolean other) { ... }
|     Boolean or(Boolean other) { ... }
|     ...
| }

Otras aplicaciones frecuentes del patrón Doubleton son: Gender(Male/Female), Choice(Yes/No), Switch(On/Off), YinYang (Yin/Yang), CharacterAligment(Good/Evil), PoliticAligment(Democrat/Republican), y este último uso ha sido deprecado: EngineType(Diesel/Gasoline).

Permalink Dejar un comentario