在魔法世界的某个角落,丽莎和艾瑞克找到了一座隐藏的图书馆。这座图书馆似乎有着无数的书籍,但出奇地,当他们走近时,却发现只有一本古老的大书放在中央。这本书被称为“知识之书”。
艾瑞克打开书,向丽莎展示:“看,这本书只有一些基本的图案和符号,但当你需要某种知识时,它就会为你组装出完整的内容。”
他继续解释:“这其实就是享元模式的应用。它通过共享和重用已存在的对象来最大化内存的使用,而不是为每个需要的内容都创建新的对象。”
// 享元对象
interface Knowledge {
void display(String uniqueContent);
}
class SharedKnowledge implements Knowledge {
private String sharedSymbol;
public SharedKnowledge(String sharedSymbol) {
this.sharedSymbol = sharedSymbol;
}
@Override
public void display(String uniqueContent) {
System.out.println("Displaying " + sharedSymbol + " with unique content: " + uniqueContent);
}
}
class KnowledgeFactory {
private Map<String, Knowledge> knowledges = new HashMap<>();
public Knowledge getKnowledge(String sharedSymbol) {
if (!knowledges.containsKey(sharedSymbol)) {
knowledges.put(sharedSymbol, new SharedKnowledge(sharedSymbol));
}
return knowledges.get(sharedSymbol);
}
}
这个“知识之书”会将通用的图案和符号存储起来,并根据需要组装出特定的知识。例如,同样的魔法基础符号可以被用来形成火球术、冰箭术或其他法术,而不是为每一个法术都存储一套完整的符号。
艾瑞克又给出了一个业务场景的例子:“在现实世界中,享元模式经常被用于那些有大量相似对象的系统,例如文本编辑器。文本编辑器不会为文档中的每个字符都存储一份字体和样式,而是将它们共享。”
class CharacterStyle {
private String font;
private String size;
public CharacterStyle(String font, String size) {
this.font = font;
this.size = size;
}
public void applyStyle(char character) {
System.out.println("Displaying character '" + character + "' with font: " + font + " and size: " + size);
}
}
class StyleFactory {
private Map<String, CharacterStyle> styles = new HashMap<>();
public CharacterStyle getStyle(String font, String size) {
String key = font + "_" + size;
if (!styles.containsKey(key)) {
styles.put(key, new CharacterStyle(font, size));
}
return styles.get(key);
}
}
在他们探索图书馆的过程中,丽莎更加深入地理解了享元模式的意义,她说:“所以,这本知识之书通过共享和组合,为我们提供了无尽的知识,而不是存储每一页的完整内容。”
艾瑞克微笑道:“没错,这就是享元模式的魔法,简洁而高效。”