设计模式(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
- 设计模式(11)——享元(Flyweight)模式
- 设计模式—FlyWeight享元模式
- 设计模式(11)——享元 Flyweight
- 设计模式——享元模式(Flyweight)
- JAVA设计模式——享元模式(Flyweight)
- Java设计模式——享元模式(Flyweight)
- 设计模式之——享元(Flyweight)模式
- 设计模式——享元FlyWeight
- 设计模式(11) 享元模式(FLYWEIGHT)
- 设计模式:享元模式(Flyweight)
- 设计模式:享元模式(Flyweight)
- 设计模式:享元模式(Flyweight)
- 设计模式-享元模式(Flyweight)
- 设计模式 Design Parttern ——享元模式FlyWeight
- 设计模式——享元模式(FlyWeight)
- 【设计模式】—— 享元模式Flyweight
- java设计模式——享元模式(Flyweight Pattern)
- Java设计模式——享元模式(Flyweight)
- P2P流媒体开源项目介绍
- Ubuntu中Nginx的安装与配置
- ARC总结
- poj1053
- Android学习MediaRecorder和MediaPlayer
- 设计模式(11)——享元(Flyweight)模式
- 深入理解 CocoaPods
- Shading中的插值技术
- 通过grub进入Linux系统,并修复引导
- oracle安全管理
- poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历
- The realization of an efficient extraction of keywords in an exordium
- Java基础——IO(拷贝文件+字节流-字符流缓冲区(装饰设计)-转换流-IO操作规律-异常日志-系统信息列表输出)
- Androis Studio个人总结超实用的快捷键大全