Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。
Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式:
1 一个应用程序使用了大量的对象。
2 完全由于使用大量的对象,造成很大的存储开销。
3 对象的大多数状态都可以变为外部状态。
4 如果删除对象以外的状态那么可以用相对较少的共享对象取代很多组对象。
5 应用程序不依赖于对象标识。
package com.qinsoft.design; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 享元模式--结构型 */ abstract class Order { // 执行卖出动作 public abstract void sell(); } class FlavorOrder extends Order { public String flavor; // 获取咖啡口味 public FlavorOrder(String flavor) { this.flavor = flavor; } @Override public void sell() { System.out.println("卖出一份" + flavor + "的咖啡。"); } } class FlavorFactory { private Map<String, Order> flavorPool = new HashMap<String, Order>(); // 静态工厂,负责生成订单对象 private static FlavorFactory flavorFactory = new FlavorFactory(); private FlavorFactory() { } public static FlavorFactory getInstance() { return flavorFactory; } public Order getOrder(String flavor) { Order order = null; if (flavorPool.containsKey(flavor)) {// 如果此映射包含指定键的映射关系,则返回 true order = flavorPool.get(flavor); } else { order = new FlavorOrder(flavor); flavorPool.put(flavor, order); } return order; } public int getTotalFlavorsMade() { return flavorPool.size(); } } public class Flyweight { // 客户下的订单 private static List<Order> orders = new ArrayList<Order>(); // 订单对象生成工厂 private static FlavorFactory flavorFactory; // 增加订单 private static void takeOrders(String flavor) { orders.add(flavorFactory.getOrder(flavor)); } public static void main(String[] args) { // 订单生成工厂 flavorFactory = FlavorFactory.getInstance(); // 增加订单 takeOrders("摩卡"); takeOrders("卡布奇诺"); takeOrders("香草星冰乐"); takeOrders("香草星冰乐"); takeOrders("拿铁"); takeOrders("卡布奇诺"); takeOrders("拿铁"); takeOrders("卡布奇诺"); takeOrders("摩卡"); takeOrders("香草星冰乐"); takeOrders("卡布奇诺"); takeOrders("摩卡"); takeOrders("香草星冰乐"); takeOrders("拿铁"); takeOrders("拿铁"); //卖咖啡 for (Order order : orders) { order.sell(); } // 打印生成的订单java对象数量 System.out.println("\n客户一共买了 " + orders.size() + " 杯咖啡! "); // 打印生成的订单java对象数量 System.out.println("共生成了 " + flavorFactory.getTotalFlavorsMade() + " 个 FlavorOrder java对象! "); } }