2011-04-07 20 views
11

¿Qué factores influyen en el patrón de diseño apropiado para usar?Clases de Singleton y Static Utility

Aclaración:

La razón por la que hago esta pregunta es porque estoy diseñando una aplicación que requiere de múltiples clases de fábrica estática y clases de dirigentes únicos. A veces, me confundo en cuanto a qué diseño debería emplear y pensé que preguntar a esta comunidad por qué y cuando pueden ayudarme a aclarar un poco las cosas.

+0

Eso es bastante vago ... –

+0

Igualado, aunque es posible que desee ser un poco más descriptivo con sus preguntas en un futuro próximo. :-) –

+0

Supongo que es lo que la gente de stackoverflow considera fuera de tema. Si expresa la motivación de su pregunta y muestra algunos ejemplos de la vida real, entonces las respuestas pueden estar más enfocadas. De lo contrario, es probablemente una pregunta demasiado amplia y subjetiva. –

Respuesta

6

Uso las clases de utilidad estáticas para funciones compartidas que se invocarán desde diferentes contextos - p. Ej. funciones matemáticas similares a las de java.util.Math. Este es un patrón apropiado, suponiendo que se trata de funciones "puras" (es decir, no manipular ningún estado ni acceder a ningún dato que no sean los parámetros que se les dan).

Rara vez uso singletons, y en particular trato de evitar singletons globales. Sufren de todos los problemas habituales asociados con las variables globales. Hacen que las pruebas sean difíciles, y a menos que su singleton también sea inmutable, introducen problemas de estado global. El lugar principal que he encontrado útiles es en cortes de rendimiento que dependen de la identidad del objeto - por ejemplo:

public static final END_OF_SEQUENCE_MARKER=new EndMarker(); 

A continuación, cuando se atraviesa una secuencia sólo se puede probar si (== objeto END_OF_SEQUENCE_MARKER). Debido a que es una referencia final estática, el JIT convertirá esto en una prueba extremadamente rápida ....

EDITAR

Habiendo visto a su clarificación, algunos comentarios adicionales rápidas:

  • clases de fábrica estático por lo general no tienen sentido. El objetivo de una clase de fábrica es que puede crear una instancia (¡o una subclase!), Realizar algunos cambios de configuración en el objeto de fábrica y luego usarlo para generar instancias de objetos de acuerdo con la configuración que necesite. Si va a hacer que sea estático, también podría simplemente crear un método MyObject.create (..) estático en lugar de tener una clase MyObjectFactory estática completa ...
  • Del mismo modo, ¿por qué tener una clase de gestor de singleton separado? ? Por lo general, la mejor clase para administrar el singleton es la clase singleton en sí misma, ya que normalmente necesitará acceder a un constructor privado, suponiendo que quiera garantizar que solo se creará una sola instancia. Con solo tener un método simple MySingleton.getInstance() estático usualmente hará todo lo que necesite.
13

Singleton se utiliza cuando se necesita crear una instancia de un solo objeto y todos los accesos a los objetos solicitados pasan por esta instancia en particular. Este objeto puede mantener el estado si lo desea.

Static Utility se usa cuando tiene una clase que es simplemente funciones de utilidad sin estado ... no mantiene el estado. Una instancia del objeto nunca se crea una instancia.

+0

¿Qué quiere decir con clase manteniendo un estado (lo que indica)? – Mercury

1

No estoy seguro de cuál es la pregunta aquí.

Los patrones singleton se usan cuando la instancia tiene un estado que puede conservarse o modificarse a través de varias llamadas; puede tratarse de un grupo de conexiones u otro objeto compartido al que la clase proporciona acceso.

Las clases de utilidad estática se utilizan cuando cada método individual es sin estado, y no tiene relación con los otros métodos que proporciona la clase.

2

Las clases de utilidad estática de IMO trazan un contrato concreto entre la persona que llama y la clase. Esto es diferente a los singletons en los que puede cambiar la implementación entre bastidores para hacer que su proveedor llamado 'singleton' entregue una nueva instancia cada vez que se realiza una llamada al getInstance.

Así que sí, básicamente use métodos de utilidad estáticos cuando esté absolutamente seguro (por ejemplo, Math) nunca necesitaría una instancia y usar singleton cuando crea que una sola instancia es suficiente por el momento pero podría cambiar en el futuro (por ejemplo, proveedores de conexión).