目录
0、定义
运营共享技术有效地支持大量细粒度的对象
1、享元模式的三种角色
- 享元接口(Flyweight):是一个接口,该接口定义了享元对外公开其内部数据的方法,以及享元接收外部数据的方法。
- 具体享元(Concrete Flyweight):实现享元接口的类。
- 享元工厂(Flyweight Factory):享元工厂是一个类,该类的实例负责创建和管理享元对象,用户或其他对象必须请求享元工厂为它得到一个享元对象。
2、享元模式的UML类图
3、示例代码
享元接口
package xyz.jangle.design.flyweight;
public interface Flyweight {
public void operation(int extrinsicState);
}
具体享元
package xyz.jangle.design.flyweight;
public class ConcreteFlyweight implements Flyweight {
private int intrinsicState;
public ConcreteFlyweight(int intrinsic) {
super();
this.intrinsicState = intrinsic;
}
@Override
public void operation(int extrinsicState) {
System.out.println(intrinsicState);
System.out.println(extrinsicState);
}
}
享元工厂
package xyz.jangle.design.flyweight;
import java.util.HashMap;
import java.util.Map;
public class FlyweightFactory {
private Map<String, Flyweight> hashMap = new HashMap<String, Flyweight>();
private static FlyweightFactory factory = new FlyweightFactory();
private FlyweightFactory() {}
/**
* 获取唯一实例
* @return
*/
public static FlyweightFactory getInstance() {
return factory;
}
public Flyweight getFlyweight(String key) {
if(hashMap.containsKey(key)) {
return hashMap.get(key);
}else {
ConcreteFlyweight flyweight = new ConcreteFlyweight(Integer.valueOf(key));
hashMap.put(key, flyweight);
return flyweight;
}
}
}
客户端(使用)
package xyz.jangle.design.flyweight;
public class AppMain23 {
public static void main(String[] args) {
FlyweightFactory factory = FlyweightFactory.getInstance();
Flyweight flyweight = factory.getFlyweight("1");
Flyweight flyweight2 = factory.getFlyweight("2");
Flyweight flyweight3 = factory.getFlyweight("1");
System.out.println(flyweight==flyweight2); //flyweight和flyweight2使用不同的实例,返回false
System.out.println(flyweight==flyweight3); //flyweight和flyweight3使用相同的实例,返回true
flyweight.operation(123);
}
}
输出结果
false
true
1
123