FlyWeight - 享元模式

FlyWeight-享元模式

Why

顾名思义:用共享的方式高效地支持大量细粒度对象。

当系统中存在大量相似对象时,我们不希望为每个对象都重新分配内存。

所以我们把这些对象中可以共享的部分提取出来(内部状态)

而不共享的部分(外部状态)则由外部在使用时动态传入。

享元模式 = 抽象享元定义接口 + 具体享元保存共享状态

+ 外部状态动态注入 + 工厂管理共享对象。

两种状态

image1

主要角色 image3
理解 比如你要下五子棋,棋子本身的属性除了颜色没什么不同
难道我们要下一个new一个吗?
并不,我们只需要new一黑一白,
剖解棋子:外部属性(位置)+内部属性(颜色)
要点 享元模式共享的是内部属性
享元共享的是“内部状态相同的对象”,内部状态不同就会创建新对象
优缺点 image4

Jdk

Integer

1
2
3
<td><p>IntegerCache 就是享元工厂;</p>
<p>Integer 对象的值是内部状态(可共享);</p>
<p>int i 参数是外部输入(用于查找享元);<br />

image5

public final class Integer extends Number implements Comparable<Integer> {

// ⚡ 享元缓存范围:[-128, 127]

1
2
3
4
5
6
7
8
9
10
<p>private static class IntegerCache {</p>
<p>static final int low = -128;</p>
<p>static final int high;</p>
<p>static final Integer cache[];</p>
<p><span style='background:yellow;mso-highlight:yellow'>public static Integer valueOf(int i) {</span></p>
<p><span style='background:yellow;mso-highlight:yellow'> if (i &gt;= IntegerCache.low &amp;&amp; i &lt;= IntegerCache.high)</span></p>
<p><span style='background:yellow;mso-highlight:yellow'> return IntegerCache.cache[i + (-IntegerCache.low)];</span></p>
<p><span style='background:yellow;mso-highlight:yellow'> return new Integer(i);</span></p>
<p><span style='background:yellow;mso-highlight:yellow'> }</span></p>
<p>}</p></td>