jueves, 20 de octubre de 2016

Patrón de diseño Flyweight

Patrón Flyweight

El patrón flyweight es estructural y una de sus principales funciones es reducir la memoria utilizada en casos donde existe gran cantidad de objetos con datos idénticos. Gracias a su reducción en el número de objetos necesarios para resolver un problema, es conocido entre los patrones de diseño, por disminuir el gasto de recursos. La clase mencionada como flyweight es también conocida como "peso ligero", un objeto compartido que puede ser usado en varios contextos.


¿Dónde aplica?

Nuestro sistema tiene un tipo de componente que se repite numerosas veces, y las instancias tienen una serie de características en común. Queremos optimizar el tamaño en memoria que ocupa para sacar el máximo partido al sistema y no desaprovechar los recursos con datos redundantes.


Ejemplo UML







Consecuencias

Una de las principales ventajas del patrón flyweight, también resulta ser una de sus principales debilidades. Esto se debe a la búsqueda que se debe de realizar antes de decidir si es necesario o no instanciar un nuevo objeto. Por lo tanto es necesario tomar en cuenta:

  • Usar pesos ligeros para diseños donde la cantidad de objetos que comparten atributos es pequeña y existen muchos "subtipos" que se generen pueden causar bajo rendimiento en la búsqueda de objetos.
  • Usar pesos ligeros para diseños donde la cantidad de objetos que comparten atributos es alta, puede reducir de manera considerable el gasto de memoria.



Ejemplo en JAVA:

import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;

// Instances of CoffeeFlavour will be the Flyweights
class CoffeeFlavour {
  private final String name;

  CoffeeFlavour(String newFlavor) {
    this.name = newFlavor;
  }

  @Override
  public String toString() {
    return name;
  }
}

// Menu acts as a factory and cache for CoffeeFlavour flyweight objects
class Menu {
  private Map<String, CoffeeFlavour> flavours = new ConcurrentHashMap<String, CoffeeFlavour>();

  CoffeeFlavour lookup(String flavorName) {
    if (!flavours.containsKey(flavorName))
      flavours.put(flavorName, new CoffeeFlavour(flavorName));
    return flavours.get(flavorName);
  }

  int totalCoffeeFlavoursMade() {
    return flavours.size();
  }
}

class Order {
  private final int tableNumber;
  private final CoffeeFlavour flavour;

  Order(int tableNumber, CoffeeFlavour flavor) {
    this.tableNumber = tableNumber;
    this.flavour = flavor;
  }

  void serve() {
    System.out.println("Serving " + flavour + " to table " + tableNumber);
  }
}

public class CoffeeShop {
  private final List<Order> orders = new Vector<Order>();
  private final Menu menu = new Menu();

  void takeOrder(String flavourName, int table) {
    CoffeeFlavour flavour = menu.lookup(flavourName);
    Order order = new Order(table, flavour);
    orders.add(order);
  }
  
  void service() {
    for (Order order : orders)
      order.serve();
  }
  
  String report() {
    return "\ntotal CoffeeFlavour objects made: "
        + menu.totalCoffeeFlavoursMade();
  }

  public static void main(String[] args) {
    CoffeeShop shop = new CoffeeShop();

    shop.takeOrder("Cappuccino", 2);
    shop.takeOrder("Frappe", 1);
    shop.takeOrder("Espresso", 1);
    shop.takeOrder("Frappe", 897);
    shop.takeOrder("Cappuccino", 97);
    shop.takeOrder("Frappe", 3);
    shop.takeOrder("Espresso", 3);
    shop.takeOrder("Cappuccino", 3);
    shop.takeOrder("Espresso", 96);
    shop.takeOrder("Frappe", 552);
    shop.takeOrder("Cappuccino", 121);
    shop.takeOrder("Espresso", 121);

    shop.service();
    System.out.println(shop.report());
  }
}

Referencias


El lado oscuro de java(2014) - Patrones de Diseño - Patrón Flyweight. Sitio web: http://java-white-box.blogspot.com/2014/10/patrones-de-diseno-patron-flyweight.html

EcuRed (s. f.) - Flyweight. Sitio web: https://www.ecured.cu/Flyweight

García, D. (s. f.) - Patrones estructurales (v): patrón flyweight. Sitio web: https://danielggarcia.wordpress.com/2014/03/24/patrones-estructurales-v-patron-flyweight/

No hay comentarios:

Publicar un comentario