享元模式分析与实践
享元就是共享单元(元素)的意思。单元代表了整体的部分,如果一个对象其中的部分是稳定的不会改变的,那么这个部分即可以共享。享元模式的用途就是复用对象的单元,让对象的节省内存。
一、享元模式与单例模式区别
单例模式是类级别的,一个类只能有一个对象实例;
享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;
享元模式主要是为了节约内存空间,提高系统性能,而单例模式主要为了可以共享数据;
1、优点
(1)节省内存空间,对于可重复的对象只会被创建一次,对象比较多时,就会极大的节省空间。
(2)提高效率,由于创建对象的数量减少,所以对系统内存的需求也减小,使得速度更快,效率更高。
2、缺点
提高了系统复杂性,需要分离出外部状态(k)和内部状态(v),而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱,为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
● 内部状态
内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变,它们可以作为一个对象的动态附加信息,不必直接储存在具体某个对象中,属于可以共享的部分。
● 外部状态
外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态,它是一批对象的统一标识,是唯一的一个索引值。
3、享元模式在jdk中的体现
1.1String中的intern()方法
public static void main(String[] args) {
String str1 = "法外狂徒";
String str2 = "张三";
String str3 = "法外狂徒张三";
String str4;
str4 = str1 + str2;
System.out.println(str3 == str4);
//如果是String的对象池中有该类型的值,则直接返回对象池中的对象
str4 = (str1 + str2).intern();
System.out.println(str3 == str4);
}
输出结果:false true
1.2Integer中的vauleOf()方法
在范围[-128, 127]内在Integer缓存中直接取,范围外通过new Integer(i) 生成
//Integer中的缓存数组 cache
Integer[] cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache
享元模式详解

最低0.47元/天 解锁文章
1206

被折叠的 条评论
为什么被折叠?



