结构型设计模式-享元模式

来源:互联网 发布:淘宝手机一屏尺寸多少 编辑:程序博客网 时间:2024/05/18 00:15

什么是享元模式

享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。
享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。

实现享元模式

// Instances of CoffeeFlavour will be the Flyweightsclass 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 objectsclass 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());  }}
0 0
原创粉丝点击