[C con Clase] implementacion del patron Singleton

Rolando Kindelan Nuñez rkindelan en uci.cu
Lun Sep 29 15:42:25 CEST 2008


Mira con respecto al primer ejemplo puedo decirte que en efecto el objeto se destruye cuando termina la aplicación, pero bueno siempre hay formas de destruirlo a voluntad por ejemplo:

 

class Singleton

{

 

public:

 

      // Función para obtener la única instancia de la clase

      static Singleton* Instance() 

      {

            if (0 == m_pInstance) m_pInstance = new Singleton;

            return m_pInstance;

      }

      // Función que llama al destructor de la clase, destruye la instancia y la inicializa para que una posterior //utilización cree una instancia nueva

      static void Destroy() 

      {

            if (m_pInstance)

               delete m_pInstance;       

           m_pInstance = 0;

      }

 

private:

 

      // Constructores ocultos a la inicializacion externa

      Singleton();                        

      Singleton(Singleton const&);    

      ~Singleton();

 

      static Singleton* m_pInstance;      

};

 

// Inicializar la instancia a 0

Singleton* Singleton::m_pInstance == 0;

 

 

Yo particularmente siempre utilizo esta variante, con la modificación que le puse y jamás me ha traicionado, jejejeje.

Espero haber sido de ayuda.

Saludos.

 

________________________________

  rolo.

 

La risa es la distancia más corta entre dos personas. (Victor Borge)

 

From: cconclase-bounces en listas.conclase.net [mailto:cconclase-bounces en listas.conclase.net] On Behalf Of ZeLion
Sent: Monday, September 29, 2008 5:23 AM
To: cconclase en listas.conclase.net
Subject: [C con Clase] implementacion del patron Singleton

 

Hola a todos.

 

Hace tiempo que no escribo a la lista debido al exceso de trabajo aunque sigo leyendo los post por las noches cuando tengo un poco de tiempo.

 

Bueno quería plantear un par de dudas que me han surgido recientemente en un miniproyecto en c++, haber si entre todos se hace una batida de ideas y compartimos conocimientos.

 

Estoy realizando unas interfaces (nada del otro mundo) y he decido implementar el patrón Singleton. Aunque hay mucho material por internet, hay ciertos aspectos de cada uno que no me encajan y quería exponerlos para ver posibles mejoras, soluciones o ver cual es mejor para cada caso. (No he tenido en cuenta la programación multihilo, aunque si alguien tiene algún ejemplo "sencillo" me gustaría verlo)

 

 

Ejemplo 1: El patrón descrito en el libro de patrones del GOF:

 

class Singleton

{

 

public:

 

      // Funcion para obtener la unica instancia de la clase

      static Singleton* Instance() 

      {

            if (0 == m_pInstance) m_pInstance = new Singleton;

            return m_pInstance;

      }

 

private:

 

      // Constructores ocultos a la inicializacion externa

      Singleton();                        

      Singleton(Singleton const&);    

 

      static Singleton* m_pInstance;      

};

 

// Inicializar la instancia a 0

Singleton* Singleton::m_pInstance == 0;

 

 

En este código me surgen varias dudas.

 

1.       ¿Quién destruye el objeto?, según he leído por ahí dicen que el SO destruye la memoria perdida, pero es algo que dudo y en cualquier caso también dependería del SO.

¿Alguna idea de cómo destruir este objeto?

 

 

 

Ejemplo 2: Una posible solución a la anterior, la inicialización estática

 

 

// Singleton con inicializacion estatica, pero devolviendo un puntero

class Singleton

{

 

public:

 

      // Funcion para obtener la unica instancia de la clase

      static Singleton* Instance() 

      {           

            return &m_pInstance;

      }

 

private:

 

      // Constructores ocultos a la inicializacion externa

      Singleton();                        

      Singleton(Singleton const&);    

 

      static Singleton m_pInstance; 

};

 

// Inicializar la instancia

Singleton Singleton::m_pInstance;

 

En este código me surgen varias dudas:

 

1.       ¿Esta forma compensa en el caso de una clase grande?, esta clase se crea en la pila global de la aplicación ¿podría desbordarse?.

                En cualquier caso, con esta forma se pierde el beneficio de la implementación dinámica.

 

 

 

Ejemplo 3: El singleton de Meyers 

 

 

class Singleton

{

 

public:

 

      // Funcion para obtener la unica instancia de la clase

      static Singleton& Instance() 

      {           

            static Singleton pInstance;   

            return pInstance;

      }

 

private:

 

      // Constructores ocultos a la inicializacion externa

      Singleton();                        

      Singleton(Singleton const&);    

 

};

 

 

En este código me surgen varias dudas:

                

1.       Esta es la forma mas sencilla, pero la mas difícil de entender (bajo mi punto de vista claro). En este código la instancia estática se inicializa perezosamente cuando se llama, 

                con lo que resulta mas eficaz que el ejemplo 2 (aparentemente) pero nunca se me hubiese ocurrido de no haberlo visto alguna vez. ¿se le ocurre a alguien algún

                defecto que pueda tener este código?

2.       ¿existe alguna forma de realizarlo dinámicamente?.

 

 

El primer ejemplo es el que mas me gusta por ser creado dinámicamente, pero tiene el problema de la recolección, un problema que no he tenido en lenguajes con

recolección de basura.

 

Con esta pequeña explicación dejo el hilo para discutir sobre un patrón de diseño que siempre me ha sido muy útil.

 

 

 

Gracias.

                

 

 

.: Z e L i o n :.

 

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080929/981283d7/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: image001.png
Type: image/png
Size: 630 bytes
Desc: image001.png
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080929/981283d7/attachment.png>


Más información sobre la lista de distribución Cconclase