设计模式之享元模式
享元(Flyweight)的核心思想很简单:如果一个对象实例一经创建就不可变,那么反复创建相同的实例就没有必要,直接向调用方返回一个共享的实例就行,这样即节省内存,又可以减少创建对象的过程,提高运行速度。
享元模式在Java标准库中有很多应用。我们知道,包装类型如Byte、Integer都是不变类,因此,反复创建同一个值相同的包装类型是没有必要的。以Integer为例,如果我们通过Integer.valueOf()这个静态工厂方法创建Integer实例,当传入的int范围在-128~+127之间时,会直接返回缓存的Integer实例:
public static void main(String[] args) {
Integer n1 = Integer.valueOf(100);
Integer n2 = Integer.valueOf(100);
System.out.println(n1 == n2); // true
Integer n3 = Integer.valueOf(1000);
Integer n4 = Integer.valueOf(1000);
System.out.println(n3==n4); // false
}
对于Byte来说,因为它一共只有256个状态,所以,通过Byte.valueOf()创建的Byte实例,全部都是缓存对象。
因此,享元模式就是通过工厂方法创建对象,在工厂方法内部,很可能返回缓存的实例,而不是新创建实例,从而实现不可变实例的复用。
Integer 和 Byte 中都有 IntegerCache 和 ByteCache内部类 Long也有
对象池思想和这个的联系
在学习Netty中会涉及到对象池,减少new一个对象的操作,用完这个对象后会归还
在用的时候如果对象池中有对象则直接用,用之前会抹除一些之前的使用痕迹set一些初始值.
其他池化思想
线程池,数据库连接池
复用相同的资源,减少浪费,减少新建和销毁的成本;
减少单独管理的成本,统一交由"池";进行统一管理