通过共享技术,有效地支持大量细粒度的对象。
什么是细粒度对象?一个对象内部包含了多个其他对象?内部包含的对象共享?
大量相似对象的情况: 当一个应用程序使用大量相似对象,且这些对象可以被共享时,使用享元模式可以减少内存占用。典型的例子是文本编辑器中的字符对象,其中相同字符只需创建一次并共享。
缓存: 享元模式可以用于实现缓存,特别是在需要频繁访问、计算成本高昂的数据时。将已经计算好的数据缓存起来,并在需要时重用,可以提高系统的性能。
连接池: 在数据库连接池、线程池等资源池的设计中,享元模式也经常被应用。共享可用的连接或线程对象,避免频繁地创建和销毁。
public interface CharFlyweight<CharFlyweight> {
int compareTo(CharFlyweight o);
}
public class Character implements CharFlyweight<Character> {
private final char value;
public Character(char value) {
this.value = value;
}
@Override
public int compareTo(Character anotherCharacter) {
return this.value - anotherCharacter.value;
}
@Override
public String toString() {
char buf[] = {value};
return String.valueOf(buf);
}
}
public class CharFactory {
private static final Map<java.lang.Character, Character> charPool = new HashMap<>();
public static CharFlyweight getCharacter(char value) {
if (!charPool.containsKey(value)) {
charPool.put(value, new Character(value));
}
System.out.println(charPool.size());
return charPool.get(value);
}
}
public class Client {
public static void main(String[] args) {
StringBuilder content = new StringBuilder()
.append(CharFactory.getCharacter('H'))
.append(CharFactory.getCharacter('e'))
.append(CharFactory.getCharacter('l'))
.append(CharFactory.getCharacter('l'))
.append(CharFactory.getCharacter('o'));
System.out.println("content = " + content);
}
}
1
2
3
3
4
content = Hello