[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