设计模式学习(十二):享元模式

作者:Grey

原文地址:

博客园:设计模式学习(十二):享元模式

CSDN:设计模式学习(十二):享元模式

享元模式

享元模式是一种结构型模式。

一个应用场景是:运用共享技术有效地支持大量细粒度的对象。主要解决

假设我们有一个子弹类,同时我们设计一个子弹池,子弹池负责提供子弹

public class BulletPool {
    List<Bullet> bullets = new ArrayList<>();
    {
        for (int i = 0; i < 10; i++) {
            bullets.add(new Bullet(true));
        }
    }
    public Bullet getBullet() {
        for (int i = 0; i < bullets.size(); i++) {
            if (bullets.get(i).living) {
                return bullets.get(i);
            }
        }
        return new Bullet(true);
    }
}

可以看到 getBullet 逻辑,如果池子中有子弹,就拿池中的子弹,如果没有,就 new 一个新的子弹返回。

上述示例的 UML 图如下

设计模式学习(十二):享元模式-LMLPHP

享元模式应用

  • 使用对象池对高并发下的内存进行管理
  • Java 中 Boolean 类的valueOf(boolean b) 方法 ,这个方法返回的 Boolean 对象不会新 new 出来,而是复用的同一个, 源码如下:
public static Boolean valueOf(boolean b){
    return(b?TRUE:FALSE);
}
public static final Boolean TRUE=new Boolean(true);
public static final Boolean FALSE=new Boolean(false);
  • Netty 中的 Buffer 分配。

  • 连接池管理,例如:Apache Commons Pool

  • Java SE 中的 IntegerCache 类和 String 类

注:Java 提供了两个配置 IntegerCache 的参数

//方法一:
-Djava.lang.Integer.IntegerCache.high=255
//方法二:
-XX:AutoBoxCacheMax=255

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

11-11 20:21