说明

解决问题:
系统中存在多个相同对象,需要共享一份对象的拷贝,而不是每一次使用都要创建对象。

好处:[复用大对象、节省内存空间和对象创建时间]
1.节省重复创建对象的开销,享元对象只会被创建一次。
2.创建数量少,系统内存需求减少,gc的压力也会降低。

注意点:
1.享元工厂维护享元对象,提供对外获取对象的方法

实现方式:
参考FlyWeight下的实现

享元对象是不可相互替换的。对象池中的对象都是等价的,比如数据库连接池。

源码实践

享元接口

  1. package xin.rtime.design.flyweight;
  2. // 享元接口
  3. public interface IFlyWeight {
  4. String method();
  5. }

接口实现

  1. package xin.rtime.design.flyweight;
  2. // 享元对象实现
  3. public class FlyWeightImpl implements IFlyWeight {
  4. @Override
  5. public String method() {
  6. return "method";
  7. }
  8. }

享元工厂

  1. package xin.rtime.design.flyweight;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. // 享元工厂
  5. // 职能: 维护享元对象
  6. public class FlyWeightFactory {
  7. private FlyWeightFactory() {}
  8. private Map<String,IFlyWeight> flyweights =new HashMap<String,IFlyWeight>();
  9. // 获取享元对象
  10. public IFlyWeight getFlyWeight(String tenantId) {
  11. IFlyWeight flyWeight = flyweights.get(tenantId);
  12. if(flyWeight == null) {
  13. flyWeight = new FlyWeightImpl();
  14. flyweights.put(tenantId, flyWeight);
  15. }
  16. return flyWeight;
  17. }
  18. public static FlyWeightFactory getInstance() {
  19. return FlyWeightFactoryHodler.instance;
  20. }
  21. private static class FlyWeightFactoryHodler {
  22. private static FlyWeightFactory instance = new FlyWeightFactory();
  23. }
  24. }

验证

package xin.rtime.design;

import xin.rtime.design.flyweight.FlyWeightFactory;
import xin.rtime.design.flyweight.IFlyWeight;

public class FlyWeightTest {

    public static void main(String[] args) {

        FlyWeightFactory factory = FlyWeightFactory.getInstance();
        IFlyWeight flyWeight = factory.getFlyWeight("test");
        System.out.println(flyWeight.method());

    }
}

享元模式 - 图1