Patrón Singleton

¿Cuándo deberíamos usar el patrón de Singleton y por qué?

http://sites.google.com/site/steveyegge2/singleton-considered-stupid

¿Por qué el Singleton es tan atractivo? Seré el primero en admitir: me gustó también. No, rayar eso, me encantó el Singleton. Se sintió como un viejo amigo desde el momento en que lo vi. Fue simple y hermoso.

Te diré por qué: es porque el patrón Singleton es un retroceso a la progtwigción no OO. Es un salvavidas para las personas que no entendieron una sola palabra que The Gang of Four intentaba decir. No sé cómo llegó allí, en primer lugar, algo de presión política de OOPSLA, sin duda, pero no pertenece allí. Es malvado …

Aquí está el resumen “corto” …

a) No he cubierto ni siquiera una décima parte de los problemas. Pero nombraré algunos de ellos.

b) Uno es la gestión de la memoria; un Singleton es básicamente solo una pérdida de memoria, si nadie va a usarlo por un tiempo. Pero no tienes idea de cuándo desasignarlo, porque nadie va a llamarte y decir “¡nadie te va a usar por un tiempo!”

Además, no se puede decir quién ha guardado referencias sobre su instancia de Singleton, ya que estuvo bastante desanimado por repartirla, ¿verdad? (Nota: las referencias débiles de Java pueden ayudar con este problema).

c) Hablando de pérdidas de memoria, ¿qué pasa si su Singleton tiene un control sobre algún recurso limitado, como una base de datos o un manejador de archivo? Supongo que debes mantener ese tonto abierto hasta que finalice tu progtwig. Gracias a Dios, los progtwigs de C ++ nunca duran más de 10 minutos antes de fallar, generalmente se están quedando sin recursos, o de intentar acceder a un Singleton que alguien liberó.

d) Otro problema es que el diseño de Singleton es sintácticamente ruidoso; la mayoría de los idiomas no lo soportan (bueno, Ruby lo hace, lamentablemente, pero eso fue probablemente antes de que Matz lo supiera), así que tienes que seguir el código repetitivo no solo en Singleton, sino en todos los que lo usan.

e) Luego está la cosa de subclases. Es casi imposible crear una subclase de Singleton, y si la administras, entonces no deberías haber estado usando Singleton en primer lugar. Ni siquiera quieres ir allí. He recorrido caminos que no me atrevo a contar. Solo pretenda que no puede hacerlo, y se ahorrará una cantidad increíble de dolor.

f) los métodos estáticos son tan flexibles como el granito. Cada vez que usa uno, está proyectando parte de su progtwig en concreto. Solo asegúrate de no tener el pie atascado mientras lo ves endurecerse. Algún día te sorprenderá que, por Dios, realmente necesites otra implementación de esa clase de PrintSpooler, y debería haber sido una interfaz, una fábrica y un conjunto de clases de implementación. D’oh!

No supongo que eso es todo. Hay muchos otros problemas. Por ejemplo, intente agregar multihilo en y ver qué pasa. Bueno, te diré lo que sucede: la mitad del tiempo, obtienes un Doubleton o un Tripleton, a menos que seas un experto en sincronización, y tener un Tripleton es tan deseable como tener tres Balrogs en tu fiesta de té. E incluso si eres un experto en sincronización y obtienes correctamente el doble control idiomático, todavía tienes que lidiar con un Balrog, y no son un día de campo.

Pero todos estos problemas se desvanecen en insignificancia en comparación con el Big One, que es que el “patrón” de Singleton lo alienta a olvidar todo lo que sabe sobre el diseño OO, ya que OO es difícil, y el procedimiento es fácil …

Si tiene una situación en la que se necesita exactamente un objeto para coordinar acciones en el sistema, puede usar este patrón. Un buen ejemplo de esto es Facade, es decir, las Fachadas se pueden implementar como singleton porque a menudo se necesita un objeto Facade en todo el sistema.

Pero, en general, generalmente es una mala práctica y debe evitarse, una razón importante es que inhibe enormemente la extensibilidad.

Java Runnable es el mejor ejemplo del patrón Singleton . Cuando desee agregar una restricción que no le permita crear más de una instancia de una clase en particular, entonces es mejor implementar un Patrón de Singleton . Puntos clave para implementar singleton:

  • Constructor privado
  • Variable de instancia privada estática de la clase Singleton en sí
  • Método getter público solo en la primera vez inicializará la variable anterior, y siempre devolverá la misma instancia de una clase Singleton.

    class Singleton { private static Singleton instance; private Singleton(){ } public static Singleton getInstance(){ if(instance=null){ instance=new Singleton(); } return instance; } ........ } 

    Y para la seguridad del hilo: getInstance () necesita sincronizarse.

En teoría: cuando necesita restringir la instanciación de un objeto a una instancia. En la práctica: nunca.

Como se dijo, la intención de un patrón único es garantizar que se instancia una única instancia de una clase.

El patrón singleton se considera uno de los patrones “malos” en el catálogo de patrones GOF, ya que el singleton conduce al acoplamiento en el código y dificulta la prueba (unidad) del código. El último punto no es 100% verdadero en (la mayoría) de los lenguajes de tipo dynamic / flojo porque puedes usar el código de parche de mono.

Echemos un vistazo al acoplamiento: cada pieza de código que usa Singleton se acopla directamente a la implementación de Singleton. Esto es difícil / imposible de simular y, dado que los Singleton se usan a menudo para servicios de infraestructura como una capa de acceso a la base de datos, la unidad que desea probar está acoplada a la implementación concreta de la capa de acceso a la base de datos. Pero para una prueba unitaria no desea golpear la base de datos, quiere tener alguna capa de acceso de datos falsa. Usted termina en una situación en la que se pregunta por qué utilizó el patrón singleton.

Recomendaría el patrón singleton solo para software “simple”, pero como todos sabemos, el software tiende a crecer. Para comenzar complejo simple y final después de algunos años.

Cuando no desea crear varias instancias del mismo tipo, necesita ir a singleton. Pero lo mismo se puede lograr si usa clases estáticas. Entonces, el punto aquí es que no es la única instancia, sino el control sobre la creación de instancias, evitando así el consumo innecesario de recursos preciosos.

Piense en todo en donde más de una instancia sería un error (inconsistencia). Esto podría ser un objeto Aplicación (objeto raíz para una aplicación) o un administrador de seguridad de toda la aplicación, etc. El singleton es solo una forma de hacer cumplir que en clase solo puede tener una instancia.

El patrón Singleton está a punto de garantizar que una clase tenga solo una instancia y proporcione un punto de acceso global a ella.

Cuando desee que un conjunto de objetos diferentes pueda hacer referencia a un solo objeto. Tal vez quieran que todos usen el mismo PhysicsEngineDude o algo así … ¡No querrás objetos diferentes que tengan diferentes modelos de física cuando vivan en el mismo mundo!

Cuando solo necesitas una instancia de una clase. Uno de los mejores ejemplos es el registrador. Solo necesitas una instancia de esto.

Cuando solo hay una instancia de una clase que se necesita en el sistema. Ya que solo tiene una instancia, entonces usted puede decidir rígidamente cómo los usuarios pueden acceder a ella.

  • En ingeniería de software, el patrón singleton es un diseño
    patrón que restringe la Ejecución de una clase a un objeto.
    Esto es útil cuando se necesita exactamente un objeto para coordinar
    acciones en todo el sistema.

  • La aplicación necesita una y solo una instancia de un objeto.
    Además, la inicialización lenta y el acceso global son necesarios.

Más aquí…

http://www.dzone.com/links/r/java_ee_singleton_design_pattern_introduction.html

El patrón singleton se debe usar cuando desee aplicar solo una instancia de una clase creada en su aplicación. Esto podría ser porque:

  • crear dicho objeto es intensivo en recursos

  • el objeto es un objeto de nivel de aplicación; por lo tanto, tener instancias múltiples de ellos no tiene sentido.

Por lo tanto, diseñar una clase como singleton tiene sentido. Para obtener más información, consulte el patrón de diseño singleton explicado con el ejemplo de c # .net