2009-04-06 16 views
12

¿No es una clase con todos los miembros/métodos estáticos una especie de patrón de diseño singleton? ¿Hay alguna desventaja en particular de tener tales clases? Una explicación detallada ayudaría.clase estática y singleton

Respuesta

17

Este tipo de clase se conoce como monostate - es algo diferente de un singleton.

¿Por qué utilizar un monostate en lugar de un singleton? En su original paper en el patrón, Bell & Crawford sugiere tres reasonns (parafraseado por mí):

  • sintaxis más acceso natural
  • Singleton carece de un nombre
  • más fácil de heredar de

I debo admitir, no encuentro ninguno de estos particularmente convincente. Por otro lado, el monostate definitivamente no es peor que el singleton.

+0

Diferente sí, pero ¿no logra exactamente lo mismo? No puedo ver cómo esto tiene ventajas o desventajas sobre el singleton "tradicional", al menos en C++. –

+0

Existe la diferencia de que el espacio no se asignará para un singleton a menos que se use, pero en la práctica un objeto singleton que nunca se usa parece ser un caso raro. ¿Alguien tiene un caso de uso común donde esto sería importante? –

+0

También tiendo a pensar que la característica de construcción perezosa de los singleton típicos es inútil en la mayoría de los casos, aquellos en los que solo necesitamos una variable global. Sin embargo, en el caso de la biblioteca, es posible que necesitemos una construcción sobre la marcha para simplificar el código del usuario final (desarrollador en realidad). –

15

Robert C. Martin escribió hace un tiempo article acerca de las diferencias entre el patrón de estado mono y el patrón singleton.

+1

Según el artículo, las únicas diferencias materiales que pude ver fueron que en Java, la destrucción de un Monostate está garantizada, pero no se puede pasar entre JVM. ¿Hay alguna diferencia relevante para C++? –

+0

Es exactamente lo mismo que con otras variables. Si se asigna dinámicamente, se debe desasignar con un separador compatible. Si está en el almacenamiento estático (ver GOTW/XC++, IIRC), se destruirá y finalizará el programa, pero no hay forma de implementar dependencias. –

+0

En cuanto al aspecto de dependencias, los singletons de A.Alexandrescu loki (de MC++ D) y los singleton de ACE permiten especificar dependencias. Por cierto, ambos son singletons no intrusivos. –

0

Para un singleton, todos los constructores deben ser privados, de modo que solo se puede acceder a través de una función. Pero estás muy cerca de eso.

+1

incorrecto, incorrecto. – Thomasz

+0

Si realmente crees que deberías volver a leer sobre singletons. Los constructores privados y uno o más miembros estáticos solo accessilbe a través de una función de miembro público es la definición misma de un singleton – DaClown

+1

Si esta respuesta es tan incorrecta que merece 5 downvotes, ¿podría dejar un comentario por qué? Algo como "mal, mal, no" no es útil y todavía no estoy convencido de que estoy equivocado. – DaClown

1

clase con todos los miembros/métodos estáticos una especie de patrón de diseño Singleton

Clase - No patrón. Cuando hablamos de clases podemos decir que la clase implementa el patrón.


Funciones estáticas: no son funciones miembro, son similares en funciones globales. Tal vez no necesitas ninguna clase?

Presupuesto de wikipedia:

En la ingeniería de software, el singleton patrón es un patrón de diseño que es utilizado para restringir creación de instancias de una clase a un objeto.

Según esta definición, su aplicación no es la implementación Singleton - no utiliza idea común ejemplo uno (o varios en la definición ampliada) de clase.

Pero a veces (no siempre) el uso de la clase con todas las funciones estáticas y el patrón de singleton - no tiene una diferencia significativa.

2

Considere la posibilidad de una familia de clases de registro. Todos implementan "LogMessage (message, file, line_number). Algunos envían mensajes a stderr, algunos envían correos electrónicos a un conjunto de desarrolladores, algunos incrementan el recuento del mensaje en particular en una tabla de frecuencia de mensajes, alguna ruta a/dev/null .En tiempo de ejecución, el programa verifica su vector de argumento, registro o variables de entorno para las que utilizará la técnica de registro y crea una instancia del Logging Singleton con un objeto de una clase adecuada, posiblemente cargando una DLL proporcionada por el usuario final para hacerlo. Esa funcionalidad es difícil de duplicar con Singleton estático puro.