Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己
对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广
泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Flyweight(享元模
式)模式是比较常用的一个模式。
应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是
重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中.
类)。
对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个
字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的
共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用
(context),是不可共享的.
种口味的咖啡,那么我们就没有必要生成1W个订单对象,通过享元模式我们只需要
生成20个订单对象。
=============== 1、 Order.java package flyweight; public abstract class Order { //执行卖出动作 public abstract void sell(); //获取咖啡口味 public abstract String getFlavor(); } =============== 1 end
=============== 2、 FlavorOrder.java package flyweight; public class FlavorOrder extends Order{ private String flavor; public FlavorOrder(String flavor){ this.flavor = flavor; } public String getFlavor(){ return this.flavor; } public void sell(){ System.out.println("卖出一杯 [" + flavor + "]。" ); } } =============== 2 end
=============== 3、 FlavorFactory.java package flyweight; import java.util.HashMap; import java.util.Map; public class FlavorFactory { //订单池 private Map<String,Order> flavorPool = new HashMap<String,Order>(20); //静态工厂,负责生成订单对象 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)){ order = flavorPool.get(flavor); }else{ //获得新口味订单 order = new FlavorOrder(flavor); //放入对象池 flavorPool.put(flavor, order); } return order; } //获得已经卖出的咖啡全部口味数量 public int getTotalFlavorsMade() { return flavorPool.size(); } } =============== 3 end
=============== 4、 Client.java package flyweight; import java.util.ArrayList; import java.util.List; public class Client { //客户下的订单 private static List<Order> orders = new ArrayList<Order>(100); //订单对象生成工厂 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("n共生成了 " + flavorFactory.getTotalFlavorsMade() + " 个 FlavorOrder java对象! "); } } =============== 4 end