设计模式之享元模式

享元(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一些初始值.

其他池化思想

线程池,数据库连接池

复用相同的资源,减少浪费,减少新建和销毁的成本;

减少单独管理的成本,统一交由"池";进行统一管理

References

posted @ 2021-03-09 23:41  胖大星-  阅读(49)  评论(0编辑  收藏  举报