享元模式 | 魔法图书馆:无尽的知识之书

在魔法世界的某个角落,丽莎和艾瑞克找到了一座隐藏的图书馆。这座图书馆似乎有着无数的书籍,但出奇地,当他们走近时,却发现只有一本古老的大书放在中央。这本书被称为“知识之书”。

艾瑞克打开书,向丽莎展示:“看,这本书只有一些基本的图案和符号,但当你需要某种知识时,它就会为你组装出完整的内容。”

他继续解释:“这其实就是享元模式的应用。它通过共享和重用已存在的对象来最大化内存的使用,而不是为每个需要的内容都创建新的对象。”

// 享元对象
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);
    }
}

在他们探索图书馆的过程中,丽莎更加深入地理解了享元模式的意义,她说:“所以,这本知识之书通过共享和组合,为我们提供了无尽的知识,而不是存储每一页的完整内容。”

艾瑞克微笑道:“没错,这就是享元模式的魔法,简洁而高效。”

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值