说明
解决问题:
系统中存在多个相同对象,需要共享一份对象的拷贝,而不是每一次使用都要创建对象。
好处:[复用大对象、节省内存空间和对象创建时间]
1.节省重复创建对象的开销,享元对象只会被创建一次。
2.创建数量少,系统内存需求减少,gc的压力也会降低。
注意点:
1.享元工厂维护享元对象,提供对外获取对象的方法
实现方式:
参考FlyWeight下的实现
享元对象是不可相互替换的。对象池中的对象都是等价的,比如数据库连接池。
源码实践
享元接口
package xin.rtime.design.flyweight;// 享元接口public interface IFlyWeight {String method();}
接口实现
package xin.rtime.design.flyweight;// 享元对象实现public class FlyWeightImpl implements IFlyWeight {@Overridepublic String method() {return "method";}}
享元工厂
package xin.rtime.design.flyweight;import java.util.HashMap;import java.util.Map;// 享元工厂// 职能: 维护享元对象public class FlyWeightFactory {private FlyWeightFactory() {}private Map<String,IFlyWeight> flyweights =new HashMap<String,IFlyWeight>();// 获取享元对象public IFlyWeight getFlyWeight(String tenantId) {IFlyWeight flyWeight = flyweights.get(tenantId);if(flyWeight == null) {flyWeight = new FlyWeightImpl();flyweights.put(tenantId, flyWeight);}return flyWeight;}public static FlyWeightFactory getInstance() {return FlyWeightFactoryHodler.instance;}private static class FlyWeightFactoryHodler {private static FlyWeightFactory instance = new FlyWeightFactory();}}
验证
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());
}
}

