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

  • 相关阅读:
    HDU_1006_Tick and Tick
    HDU_1011_Starship Troopers_树型dp
    HDU_1520_Anniversary party_树型dp
    HDU_1176_免费馅饼_16.4.23再做
    HDU_1203_01背包
    HDU_1421_搬寝室_dp
    HDU_1505_矩阵中的最大矩形_dp
    STL_map的使用
    Semantic-UI-React (称 stardust) 对比 Antd
    meteor 为基础,联合 Apollo + React + React-Router
  • 原文地址:https://www.cnblogs.com/wei57960/p/14509011.html
Copyright © 2011-2022 走看看