1. 类图
- Flyweight:享元接口
- ConcreteFlyweight:享元实现对象
- UnsharedConcreteFlyweight:非共享享元实现对象
- FlyweightFactory:享元工厂
- Client:客户端
2. 示例
同一对象实例的重复使用
2.1 享元接口
public interface FlyWeight {
void action();
}
2.2 享元实现对象
public class ChildFlyWeight implements FlyWeight {
@Override
public void action() {System.out.println("享元模式");}
}
2.3 享元工厂
public class FlyWeightFactory {
// 使用静态内部类,保证享元工厂实例只能有一个
private FlyWeightFactory() { }
private static class InnerHolder {
private static FlyWeightFactory flyWeightFactory = new FlyWeightFactory();
}
public static FlyWeightFactory getInstance() { return InnerHolder.flyWeightFactory; }
// 对象存放容器
private static Map<String, FlyWeight> map = new HashMap<>();
public FlyWeight getFlyWeight(String name) {
FlyWeight flyWeight = map.get(name);
if (flyWeight == null) {
flyWeight = new ChildFlyWeight();
map.put(name, flyWeight);
}
return flyWeight;
}
}
2.4 客户端
public class Client {
public static void main(String[] args) {
FlyWeightFactory instance = FlyWeightFactory.getInstance();
FlyWeight test1 = instance.getFlyWeight("test1");
test1.action();
}
}
3. 优点
- 减少对象数量,节省内存空间
4. 缺点
- 维护共享对象,需要额外开销