[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