Patrón singleton en C++

Código de ejemplo de la implementación de dicho patrón. El secreto está en el uso de los métodos y variables miembro static. También hay que notar el ocultamiento del constructor (y del constructor copia y sobrecarga del operador =, que no se muestran aquí).

https://pastebin.com/embed_js/MUcU50u4

/** @file singleton.cpp
* @brief Ejemplo de implementación del patrón Singleton sin apuntadores
*
* @author poo.fiunam (poo.fiunam), poo.fiunam at yahoo dot com
* @date 21/11/16 -- 22:20:08
*/

#include
#include

/*-------------------------------------------------------------------
* Clase Singleton
*-----------------------------------------------------------------*/
class Singleton
{
public:
static Singleton& GetInstance ();
// los métodos estáticos existen aunque no se hayan creado instancias de la
// clase

void Method1 () const;
// imprime el contenido de 'nombre'

void Method2 () const;

void SetNombre (std::string _nombre);
std::string GetNombre ();

private:
Singleton ();
// ocultamos al constructor para evitar que se creen instancias de esta clase

std::string nombre {"NA"};
};

Singleton::Singleton ()
{
// nada
}

Singleton& Singleton::GetInstance ()
{
static Singleton instance;
return instance;
}

void Singleton::Method1 () const
{
std::cout <nombre << std::endl;
}

void Singleton::Method2 () const
{
std::cout << "hello world" <nombre = _nombre;
}

std::string Singleton::GetNombre()
{
return this->nombre;
}

/*-------------------------------------------------------------------
* Driver program
*-----------------------------------------------------------------*/
int main(void)
{

Singleton::GetInstance().SetNombre("Fco. Javier");

Singleton::GetInstance().Method1 ();
// Singleton::GetInstance() es el punto global de acceso a todos los métodos
// de la clase ...

Singleton::GetInstance().Method2 ();
// y como GetInstance() devuelve una referencia, entonces debemos usar al
// operador . para referirnos a los métodos.

return 0;
}

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s