zoukankan      html  css  js  c++  java
  • 设计模式之享元模式

    享元(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

  • 相关阅读:
    虚幻4游戏开发_3_创建与继承材质
    Python 之 读取txt文件
    Guava ---- Concurrent并发
    leetCode 67.Add Binary (二进制加法) 解题思路和方法
    poj 1331 Multiply
    二叉树的三叉存储
    FTPClientUtil FTPclient工具
    HDU1018 Big Number n!的位数
    MyBatis參数格式化异常解决方式:MyBatisSystemException:
    Spark:大数据的电花火石!
  • 原文地址:https://www.cnblogs.com/wei57960/p/14509011.html
Copyright © 2011-2022 走看看