Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/11/2015, 04:31
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Entendiendo el patrón Singleton.

Cita:
Iniciado por dehm Ver Mensaje
Por comentar las observaciones que he hecho....
Al principio no había hecho el uso de "delete" en los constructores de copia y asignación y he creado la instancia al modo "clásico"

Código C++:
Ver original
  1. Singleton S3(Singleton::getInstance());

Pero al ver el destructor me sonaba raro que se invocase 2 veces al mismo.
Luego he visto que lo suyo es prohibir estos constructores. A cambio, me obliga a crear la instancia como referencias.
Esa línea, como comentas está mal. Como bien as notado, el patrón singleton pretende que únicamente haya una instancia del objeto para toda la aplicación y ahí estás intentando obtener una copia del objeto... lo cual lleva inevitablemente a que exista mas de un objeto.

Puede sonar un poco raro usar una variable como referencia, pero se pueden optimizar bastantes partes del código con esa tontería de las referencias. Hay que recordar que usar una referencia implica que no se llama al constructor copia del objeto...

La forma correcta de llamar a getInstance sería la siguiente:

Código C++:
Ver original
  1. Singleton& S3 = Singleton::getInstance();

Cita:
Iniciado por dehm Ver Mensaje
Ahora, por la forma de ser creada la instancia, entiendo que no tiene sentido que se le pongan parámetros.
Esa es una buena noticia, quiere decir que te van quedando claros los detalles del patrón :)

Cita:
Iniciado por dehm Ver Mensaje
Lo que no entiendo muy bien es el por qué de este patrón. Es decir, en cierto modo estoy "enmascarando" que me remito siempre al mismo objeto, pero ese comportamiento lo puedo hacer igual con punteros, entiendo yo.
La principal ventaja de este patrón con respecto al uso de punteros es que no tienes que arrastrar los punteros por todo tu código. Imagínate que en un proyecto tienes que arrastrar 5 punteros por todas tus funciones porque no te dejan usar este patrón... tus funciones tendrían los parámetros necesarios para funcionar y un plus de 5 parámetros para arrastrar los punteros.

Como contrapartida, con este patrón se pierde un poco el hilo de la ejecución. El acceso al Singleton es libre y queda en manos del desarrollador el hacer un uso responsable del mismo... si en vez del singleton arrastras el puntero es muy sencillo prohibir el acceso al mismo simplemente no proporcionándolo.

A mi personalmente no me gusta demasiado tener que depender de este patrón, si hay razones de peso suficientes vale, pero con cautela. Es muy facil caer en la tentación y convertir toda la aplicación en una sucesión de singleton...

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.