定义:
运用共享技术有效地支持大量细粒度对象
在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。
该段落及图片援引 http://blog.csdn.net/flustar/article/details/2077278
package Flyweight;
/**
* 描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
* @author Administrator
*
*/
public interface Flyweight {
void action(int arg);
}
package Flyweight;
public class FlyweightImpl implements Flyweight {
@Override
public void action(int arg) {
// TODO Auto-generated method stub
System.out.println("参数值: " + arg);
}
}
package Flyweight;
import java.util.HashMap;
import java.util.Map;
/**
* 建并管理flyweight对象。 确保合理地共享flyweight。当用户请求一个flyweight时,
* FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
*
* @author Administrator
*
*/
public class FlyweightFactory {
private static Map flyweights = new HashMap();
public FlyweightFactory(String arg) {
flyweights.put(arg, new FlyweightImpl());
}
public static Flyweight getFlyweight(String key) {
if (flyweights.get(key) == null) {
flyweights.put(key, new FlyweightImpl());
}
return (Flyweight) flyweights.get(key);
}
public static int getSize() {
return flyweights.size();
}
}
package Flyweight;
/**
* 运用共享技术有效地支持大量细粒度的对象。
适用性
当都具备下列情况时,使用Flyweight模式:
1.一个应用程序使用了大量的对象。
2.完全由于使用大量的对象,造成很大的存储开销。
3.对象的大多数状态都可变为外部状态。
4.如果删除对象的外部状态,那么可以相对较少的共享对象取代很多组对象。
5.应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Flyweight fly1 = FlyweightFactory.getFlyweight("a");
fly1.action(1);
Flyweight fly2 = FlyweightFactory.getFlyweight("a");
System.out.println(fly1 == fly2);
Flyweight fly3 = FlyweightFactory.getFlyweight("b");
fly3.action(2);
Flyweight fly4 = FlyweightFactory.getFlyweight("c");
fly4.action(3);
Flyweight fly5 = FlyweightFactory.getFlyweight("d");
fly4.action(4);
System.out.println(FlyweightFactory.getSize());
}
}
因为理解的不是很好,所以写的也不好, 推荐 http://www.cnblogs.com/java-my-life/archive/2012/04/26/2468499.html