享元模式定义:
使用共享对象可有效地支持大量的细粒度对象
说人话就是:系统运行时创建出来的对象,如果可以重复利用,就可以一直留着,下次继续使用。
在面向对象编程语言中, 有一些特殊的对象,要么会频繁使用,要么会占内存,要么创建耗时。如果不考虑复用这些对象,还要反复频繁创建,就有可能会导致系统内存爆掉,或者拖累系统运行效率。
因此,共享这些对象,反复利用,就是件很自然的事情,这就是享元模式。很好理解,千万不完想复杂了。
例如,在Java
中通过Integer.value(n)
创建Integer
对象实例,如果-128 <= n <= 127
,那么得到的就是共享Integer
对象:
@IntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
从源码中可以看到,有个IntegerCache
会缓存部分Integer
对象,入参不在这个区间的才会用new
关键字创建新的Integer
对象。
享元模式、单例模式、工厂模式,很多时候都会结合着用。
享元模式和单例模式的区别并不明显,它们的理念是互通的,而且都必须要考虑对象的线程安全性问题。