[C con Clase] implementacion del patron Singleton

Programante programante en gmail.com
Lun Sep 29 23:05:49 CEST 2008


ZeLion escribió:
>
> Hola a todos.
>
>  
>
Hola ZeLion :)
A ver si puedo ayudarte.

> *Ejemplo 1: El patrón descrito en el libro de patrones del GOF:*
>
>
>       // Funcion para obtener la unica instancia de la clase
>
>       static Singleton* Instance()
>
>       {__
>
>             if (0 == m_pInstance) m_pInstance = new Singleton;
>
>             return m_pInstance;
>
>       }
>
>
> 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?
>
Ese objeto estará presente hasta que se cierre el programa. Ten en 
cuenta que en los demás casos ocurre lo mismo. La memoria no se liberará 
hasta que cierres el programa. Lo que sí es probable es que no se 
ejecute el destructor.
Si realmente quisieras borrarlo, podrías hacer delete 
Singleton::Instance(); justo antes de terminar el programa, pero 
ensucias por completo el uso del patrón.
Es más, en vez de devolver un puntero a la instancia, seguramente 
quedaba mejor devolviendo una referencia.

> *Ejemplo 2: Una posible solución a la anterior, la inicialización 
> estática*
>
>  
>
> // 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.
>
No se crea en la pila, sino en el área global de datos, donde están las 
variables globales.
En este caso sí se llamará al destructor, el compilador añade código 
para ello.
 
>
> *Ejemplo 3: El singleton de Meyers *
>  
>
>       // Funcion para obtener la unica instancia de la clase
>
>       static Singleton& Instance()
>
>       {          
>
>             static Singleton pInstance;  
>
>             return pInstance;
>
>       }
>
>
>  
>
>  
>
> 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?.
>
Podrías usar:

      static Singleton& Instance()

      {          

            static Singleton* pInstance = new Singleton;

            return pInstance;

      }





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