设计模式学习(十二):享元模式
作者:Grey
原文地址:
享元模式
享元模式是一种结构型模式。
一个应用场景是:运用共享技术有效地支持大量细粒度的对象。主要解决
假设我们有一个子弹类,同时我们设计一个子弹池,子弹池负责提供子弹
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 图如下
享元模式应用
- 使用对象池对高并发下的内存进行管理
- 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