[C con Clase] implementacion del patron Singleton

ZeLion Zelion_cracking en yahoo.es
Lun Sep 29 11:22:47 CEST 2008


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/5400194f/attachment.html>


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