Patrones de diseño: una guía rápida del patrón Singleton.

Esta es otra guía rápida para dominar un patrón de diseño muy utilizado, el patrón Singleton. El patrón Singleton es uno de los patrones de diseño más simples pero más controvertidos (con ventajas y desventajas). Esta es una de las principales razones por las que es muy común en la programación de entrevistas.

El patrón Singleton se clasifica en los patrones de diseño de creación que se trata de instanciación de clase / objeto. Más precisamente, cómo usar efectivamente la herencia (patrones de creación de clase) o la delegación (patrones de creación de objetos). [por Patrones de diseño explicados simplemente]

Definición de Singleton: en matemáticas, se define como "un conjunto que contiene exactamente un elemento". Este patrón es muy simple de entender y fácil de implementar, ya que solo tiene unas pocas líneas de código y la aplicación es bastante sencilla. Es un patrón que garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global. Por ejemplo, solo podemos tener un Papa de Italia activo, por lo tanto, es posible que el Papa pueda ser representado con un patrón Singleton.

Paso 1 - Palabras clave

Definir palabras clave es la receta secreta en esta serie de guías rápidas. Este método me ayudó a comprender realmente los patrones de diseño, codificarlos en mi mente y comprender las diferencias entre otros patrones de diseño.

Esta vez, las palabras clave nos llevan de vuelta a lo básico. Es una introducción al código muy simple que seguirá. Siéntase libre de pasar al siguiente paso si se siente cómodo con los términos.

  1. Clase-instancia: Una instancia es una ocurrencia concreta de cualquier objeto. Por lo general, existe durante el tiempo de ejecución de un programa de computadora y enfatiza en identificar claramente el objeto. Del mismo modo, las instancias de clase se crean a partir de clases mediante subrutinas como constructores / destructores.
  2. Constructor privado: un constructor privado es un constructor de instancia especial. Generalmente se usa en clases que contienen solo miembros estáticos. Si una clase tiene uno o más constructores privados y no tiene constructores públicos, entonces otras clases (excepto las clases anidadas) no pueden crear instancias de esta clase.
  3. Miembros de datos estáticos: cuando declaramos que un miembro de una clase es estático, significa que no importa cuántos objetos de la clase se creen, solo hay una copia del miembro estático. [de TutorialPoint]
  4. Función estática: se puede llamar a una función miembro estática incluso si no existen objetos de la clase. [de TutorialPoint]

Paso 2 - Diagrama

Hay uno o dos trucos de programación para hacer una clase Singleton. Aparte de eso, es bastante trivial. Lectura del diagrama de arriba a abajo: deberíamos tener

  • Una instancia estática (subrayada) y privada (-) de la clase
  • Un constructor privado.
  • Una función pública (+) y estática que devuelve la instancia.

La definición de clase no debe tener más de 7–8 líneas de código, según el lenguaje de programación.

Paso 3 - Código por ejemplo

Sugiero copiar el código clase por clase desde mi repositorio git "Andreas Poyias" o desde los fragmentos aquí y pegarlo en cualquiera de los editores C ++ en línea disponibles como c ++ shell, jdoodle, onlineGDB y ejecutarlo para observar la salida. Luego lea los comentarios o la descripción a continuación.

Definición de clase
Estoy mostrando la definición de clase en C ++ que es de 8 líneas de código.

#include 
clase Singleton
{
público:
    Singleton estático * getInstance ();
privado:
    Semifallo(){}
    Singleton estático * s_instance;
};

Ahora pasamos a la declaración del método getInstance () y el miembro de datos estáticos que está fuera de la definición de clase. Hay diferentes formas de escribir la función getInstance. Para simplificar, elegí el que se muestra en el fragmento a continuación. Entonces, si la instancia no existe, cree una instancia si existe y simplemente devuélvala.

Singleton * Singleton :: s_instance = 0;
Singleton * Singleton :: getInstance ()
{
    if (! s_instance) {
        s_instance = new Singleton ();
        std :: cout << "No hay ninguna instancia, así que creamos una. \ n";
        return s_instance;
    }más{
        std :: cout << "¡Hola, esta es la misma instancia! \ n";
      return s_instance;
    }
}

Función principal
La función principal opera como el cliente. El cliente no puede crear una segunda instancia de la clase Singleton y se ve obligado a utilizar la existente. Esto también puede ser mostrado por la salida.

int main ()
{
 Singleton * singlA = Singleton :: getInstance ();
 Singleton * singlB = Singleton :: getInstance ();
 devuelve 0;
}
// Salida
// No hay instancia, así que creamos uno.
// ¡Hola, esta es la misma instancia!

Hay algunos beneficios para el uso del patrón Singleton. Otros patrones de diseño como Abstract Factory, Facade pueden usar el patrón Singleton (generalmente solo se requiere un objeto Facade). Como mencioné en el primer párrafo, este patrón de diseño es bastante controvertido y es por eso que una pregunta popular de la entrevista es: "¿Qué tiene de malo el patrón Singleton, o por qué el patrón Singleton se considera antipatrón?"

Antipatrón
Resumiré las razones por las cuales singleton se considera antipatrón. Hay una discusión muy popular sobre StackOverflow que proporciona muy buena justicia justificando por qué uno debe tener cuidado con este patrón de diseño.

  1. Los patrones de Singleton violan el principio de responsabilidad única: en virtud del hecho de que controlan su propia creación y ciclo de vida.
  2. Generalmente se usan como una instancia global que puede conducir a dependencias ocultas en el código que podrían exponerse a través de interfaces.
  3. Inherentemente hacen que el código esté estrechamente acoplado.
  4. Es muy difícil ajustar el patrón Singleton en un entorno de subprocesos múltiples y es muy fácil caer en problemas de condición de carrera durante la inicialización.

Para una comprensión más profunda de por qué esto se considera antipatrón, eche un vistazo en este sitio por Michael Safyan.

Como lo mencionamos anteriormente, el próximo blog será una guía rápida del patrón de diseño de Fachada. La fachada no es un patrón de creación como Singleton y Abstract Factory, pero se clasifica como un patrón de diseño estructural. No olvides dar me gusta / aplaudir mi blog y seguir mi cuenta. Esto es para darme la satisfacción de haber ayudado a otros desarrolladores y empujarme a seguir escribiendo.

Otras guías rápidas sobre patrones de diseño:

  1. Patrones de diseño: una guía rápida de Abstract Factory.
  2. Patrones de diseño: una guía rápida para el patrón de puente.
  3. Patrones de diseño: una guía rápida para el patrón de construcción.
  4. Patrones de diseño: una guía rápida para el patrón de decorador.
  5. Patrones de diseño: una guía rápida para el patrón de fachada.
  6. Patrones de diseño: una guía rápida para el patrón de observador.
  7. Patrones de diseño: una guía rápida del patrón Singleton.