1.意图
运用共享技术有效地支持大量细粒度的对象。
2.特点
抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数的形式通过此方法传入。在Java中可以由抽象类、接口来担当。
具体享元角色:实现抽象角色规定的方法。如果存在内蕴状态,就负责为内蕴状态提供存储空间。
享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!
客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。
3.UML类图
4.代码
//抽象享元角色
public interface Flyweight {
void action();
}
//具体享元角色
public class ConcreteFlyWeight implements Flyweight {
private String name;
public ConcreteFlyWeight(String name) {
this.name = name;
}
@Override
public synchronized void action() {
try {
Thread.sleep(3000);
System.out.println(name+" "+this.hashCode()+" ConcreteFlyWeight action");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//享元工厂
public class FlyweightFactory {
//定义缓存享元的实例
private static HashMap<String,Flyweight> map = new HashMap<String, Flyweight>();
public static Flyweight getFlyweight(String name){
if(map.get(name)==null){
synchronized (map){
Flyweight flyweight = new ConcreteFlyWeight(name);
map.put(name,flyweight);
}
}
return map.get(name);
}
}
public class FlyweightTest {
public static void main(String[] args) {
Flyweight flyweight = FlyweightFactory.getFlyweight("name");
flyweight.action();
Flyweight flyweight1 = FlyweightFactory.getFlyweight("name");
flyweight1.action();
Flyweight flyweight2 = FlyweightFactory.getFlyweight("name");
flyweight2.action();
}
}