design-patterns - pattern - patrones de diseño de software flyweight
¿Cuáles son las diferencias de uso práctico entre los patrones de Flyweight vs Singleton? (7)
Los dos patrones parecen lograr lo mismo. ¿Cuáles son los diferentes casos de uso en el mundo real? Gracias
El patrón estructural de peso mosca esencialmente elimina la duplicación de objetos necesarios para lograr un objetivo determinado. Por ejemplo, imagine que estaba escribiendo un ensayo (o tal vez una publicación en el desbordamiento de pila), que en última instancia consta de las mismas 26 letras en el alfabeto (inglés), repetidas muchas veces. ¿Sería más eficiente tener 1000 objetos separados, cada uno representando la letra ''E'', o tener un solo objeto representando la letra ''E'', referenciado 1000 veces? (Pista, generalmente sería lo último).
Cómo se implementa la creación de cada uno de los objetos (es decir, 26 letras) es una preocupación aparte, sin embargo, se logra comúnmente con un método de fábrica (un patrón de creación ) que utiliza características "singleton like".
- Inicializa una colección vacía de caracteres.
- ¿Se necesita la letra ''E''?
- Si ya existe, recupere ese objeto de la colección; de lo contrario, cree una nueva letra ''E'' y guárdela en la colección, para volver a utilizarla la próxima vez.
¿Se hace esto a través de un objeto singleton completo, o solo una variable privada a la que solo puede acceder el método de fábrica? Puede o no puede ser. Pero de cualquier manera, el patrón singleton es un patrón creacional , que describe formas de tener una sola instancia de un objeto en existencia en un momento dado en el tiempo, y no se preocupa por casos de uso específicos como "eliminar la duplicación de objetos necesarios para lograr un cierto objetivo ".
El peso de mosca se utiliza cuando existe una clara segregación del estado intrínseco y extrínseco del objeto. El estado intrínseco se puede compartir a través de otros objetos extrínsecos. Por ejemplo, un encabezado de los documentos se puede clasificar como estado intrínseco del objeto y se puede compartir. Pero el resto de los datos en el documento pueden ser muy dinámicos y llenados por el usuario (datos extrínsecos). Para representar datos intrínsecos, se puede crear y mantener un objeto de peso mosca dentro de la fábrica de peso mosca. El objeto de fábrica de peso mosca servirá como una colección de peso de mosca (objetos de cabecera) y se puede llenar antes y compartir en varias instancias del documento en nuestro caso.
El peso mosca es cuando tienes muchos tipos diferentes de una sola cosa.
Singleton es cuando tienes una sola cosa.
Por ejemplo, puede usar el patrón de peso de mosca para representar caracteres de teclado. Un objeto para a
, uno para b
, etc. Ambos son caracteres, pero diferentes tipos de caracteres.
Por el contrario, puede usar un singleton para representar el teclado. Solo puede haber uno.
No están relacionados:
Flyweight es reutilizar (obviamente inmutable) las instancias de una clase siempre que sea posible, en lugar de crear nuevas instancias de una clase con el mismo "valor", lo que ahorra CPU y memoria.
Singleton es cuando solo hay una instancia de una clase (generalmente mutable). A menudo se usa en entornos de subprocesos múltiples para facilitar todos los subprocesos usando una sola instancia y "viendo" el mismo estado.
No olvide que el singleton es un patrón creacional, mientras que el peso mosca es un patrón estructural. Por lo tanto, el objetivo de los dos patrones es completamente diferente.
Son dos " tipos de patrones" completamente diferentes. Singleton es un patrón de "CREACIÓN". Los patrones de creación son metodologías comunes de "creación de objetos" de orden superior. Por otro lado, el peso mosca es un "patrón estructural". Los patrones estructurales tienen que ver más con las interfaces y la implementación que con la "creación de objetos". Otra forma más fácil de describir las diferencias es que el primer tipo de patrón "Patrones de creación" se basa más en el nombre. Los segundos tipos de "patrón estructural" son más basados en verbos.
Un singleton es a menudo mutable. Eso no es posible con un peso mosca. Por ejemplo, un peso mosca podría representar un color. Sería confuso si creara un color rojo y fuera verde en su lugar porque su objeto de peso mosca subyacente se cambió a verde en otra parte del código.
También diría que un singleton es una especie de sub-patrón de peso mosca. Podría pensar que los objetos de color individuales son singletons, pero todos son parte de un sistema en el que utiliza una fábrica para seleccionar el objeto singleton / flyweight correcto.
Es realmente mucho sobre la precepción. Los pesos de vuelo no se presentan al usuario de la API como si fueran objetos únicos, mientras que los singletons sí lo son.
Ejemplos de Cacao (Objective-C):
UIApplication.sharedApplication.statusBarHidden = YES
Esto es obviamente un solo objeto y puede cambiar su estado.
UIColor *red = [UIColor redColor]
El usuario no necesita saber si el rojo es un singleton o no porque es inmutable. No puedes cambiar los objetos de color después de crearlos. Por lo tanto, no hace ninguna diferencia práctica para el usuario si son singletons o si crea nuevos objetos. Por lo tanto, tiene más sentido llamar a esto un peso mosca. Se trata de la intención.