设计模式(11)——享元(Flyweight)模式

来源:互联网 发布:java 文件名中文乱码 编辑:程序博客网 时间:2024/05/16 14:39

什么是享元模式?

享元模式跟CACHE机制类似,它运用共享技术有效地支持大量细粒度的对象。Flyweight通过尽可能地与其他对象共享数据来减少对内存的使用。
Flyweight的经典例子就是字符处理器中的字符图形。如果每个字符都用一个单独的图形表示,则会占用大量的空间。而采用字符表的形式,只保持对字符图形的引用关系,则能节省大量空间。
另一个例子是字符串的驻留(String Interning),对于相同的字符串,只保留一个拷贝。


享元模式的适用范围

1. 一个应用程序使用了大量的对象
2. 大量的对象使用造成了很大的内存开销。
3. 对象的大多数状态可变为外部状态
4. 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象
5.应用程序不依赖于对象标识。

享元模式的示例

下面用咖啡厅点咖啡来说明享元模式,其中CoffeeFlavour应用了享元。
import java.util.concurrent.CopyOnWriteArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; // 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 HashMap<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 CopyOnWriteArrayList<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();      orders.remove(order);        }  }   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
原创粉丝点击