Flyweight模式基础了解2008-04-18 08:52:06 来源:中国自学编程网 作者:佚名 点击:
抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。 ![]() { public void cooking(String foodName) { System.out.println("cooking----"+foodName); } } public class FlyWeightFactoy { private Hashtable<String, FlyWeight> storage = new Hashtable<String, FlyWeight>();
public FlyWeight getFood(String key) { FlyWeight food = (FlyWeight) storage.get(key); if ( food == null ) { food = new Food(); storage.put( key, food); } return food; } } public class TestFlyWeight { public static void main(String[] args) { FlyWeightFactoy factory = new FlyWeightFactoy(); People people = new Kitchener(); FlyWeight meal = factory.getFood("Meal"); meal.setFoodName("Meal"); meal.buy(people); } } 享元模式应当在什么情况下使用 当以下所有的条件都满足时,可以考虑使用享元模式: 一个系统有大量的对象。 这些对象耗费大量的内存。 这些对象的状态中的大部分都可以外部化。 这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。 满足以上的这些条件的系统可以使用享元对象。 最后,使用享元模式需要维护一个记录了系统已有的所有享元的表,而这需要耗费资源。因此,应当在有足够多的享元实例可供共享时才值得使用享元模式。 享元模式的优点和缺点: 享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的: 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。 相关文章: |