2012-03-26 11 views
5

Estoy creando un registrador para una aplicación. Estoy usando una biblioteca registradora de terceros. En qué registrador se implementa como singleton.¿Está extendiendo una clase singleton incorrecta?

Extendí esa clase de registrador porque quiero agregar algunas funciones estáticas adicionales. En estas funciones estáticas utilizo internamente la instancia (que es única) de Logger (que heredé).

No creo instancia de MyLogger ni reimplemento el método getInstance() de superclase. Pero sigo recibiendo advertencias, como el destructor de MyLogger no se puede crear ya que no se puede acceder al destructor de la clase primaria (Loggger).

Quiero saber, ¿Estoy haciendo algo mal? ¿Heredar el singleton es incorrecto o se debe evitar?

Respuesta

4

Dejando a los méritos del patrón singleton a un lado (hay una escuela de pensamiento que lo describe como un anti-patrón) no debería ser necesario subclase para añadir simplemente funcionalidad estática. Aquí están los enfoques específicos del idioma que yo preferiría que la subclasificación de un producto único:

  • utilizar una función independiente encerrado en un C++ espacio de nombres
  • utilizar una clase de extensión en C#
  • Usar una clase de ayuda en Java
  • utilizar una categoría en Objective-C
+0

Estoy usando lenguaje C++. Estoy pensando en crear una clase contenedora de solo métodos estáticos que no hereden de la clase Logger singleton. ¿¿Cómo es?? Y, por favor, elabore el método que describió anteriormente para C++. Gracias .. – EngineeredBrain

+0

@AnwarShaikh Eso también funciona, esto es lo que haría en Java, porque las funciones autónomas no están disponibles allí.También tomaría esa ruta en C++, pero solo si tuviera que compartir el estado u otros detalles de implementación entre las funciones que estoy agregando. – dasblinkenlight

+0

¡¡Gracias !! Lo intentaré escribiendo un envoltorio sobre él. – EngineeredBrain

0

Usaría un no singleton y delegaría llamadas al singleton cuando fuera necesario. Cada vez que tenga la oportunidad de deshacerse de un Singleton, vaya por ello.

+0

Sí, se deben evitar los singletons, pero resulta ser bueno cuando se usa para algo como Logger. ¿Qué sucede si necesito algunos métodos adicionales junto con los que están en singleton si los heredo o escribo wrapper (de clase con solo métodos estáticos) sobre singleton que usa el singleton internamente? – EngineeredBrain

+0

Ir por una envoltura. Eso es lo que quise decir con 'llamadas de delegado'. –

0

Estoy de acuerdo con Garret Hall, debe evitar Singleton si es posible. Dicho esto, no lo veo como incorrecto por una razón. La persona que implementó el Singleton te permite extenderlo. Si el desarrollador de API no desea que el registrador de clase singleton se extienda, habría hecho que el constructor sea privado, en C++, por ejemplo, o el método que sea apropiado para el idioma que está utilizando.

0

creo que escribiendo un envoltorio sobre la clase no es la solución adecuada, ya que es necesario para escribir contenedor para todos los métodos que necesita de Singleton. Y terminas escribiendo docenas de funciones.

Además, se está restringiendo el uso de todas las funciones disponibles en singleton.

¡NO UNA BUENA IDEA!

Cuestiones relacionadas