多例模式与享元模式的比较

5
我看不出“Multiton”和“Flyweight”模式之间有任何区别,请解释一下它们的不同之处。
1个回答

10

这两种模式的结果相似,但这几乎是巧合。因为它们的意图不同。

对于我来说,享元模式的主要目的是通过共享状态来减少内存使用。

多例模式的主要意图是,当您使用相同的键获取实例时,始终返回完全相同的对象实例(单例)。

  • 多例模式
    • 保证每个键只存在一个对象实例,类似于单例-每个键都有一个。
  • 享元模式
    • 通过在对象之间共享状态来降低内存消耗。

享元模式的经典示例是在文字处理器中,每个字母由一个对象表示,为了避免为每个字母创建许多对象,而只存在每个字母的一个实例。

可能可以通过使用多例来实现这一点,以确保以键“A”获取的表示“A”的对象的实例相同。在这种情况下,这两种模式确实看起来相似。

但是,享元模式并不要求只能存在单个实例(这是多例模式的要求)。因此,在文本处理器的实现中,仍然可以在每个文档中拥有每个字母对象的实例,这仍然会大大减少内存使用,并且我相信仍然是享元模式的一种实现,但不是多例模式,因为可以在不同文档中存在许多“ A”的实例。

您还可以在许多其他情况下使用享元模式来降低内存消耗,其中多例模式不适用。这可能不是一个完美的例子,但想象一下一个提供学校学生和他们所上课程列表的系统。如果有一个包含学生所上课程列表、班级,教师,可用设备等信息的学生对象。

在一个天真的模型中,学生可能会有一组Class对象,并且每个Class对象都会为每个学生创建新对象。你在每个学生身上存储了很多对象,这可能需要大量内存。相反,你可以使用享元模式(flyweight)来代替Class,并且仅在每个学生需要该课程时将其引用到相同的Class实例中。这将显著减少存储大量学生名单所需的内存。
但是对于Class实例来说,它们可能不适合成为单例模式,因为这些类是数据驱动的和动态的(可以添加和删除新类等),因此多例模式不适合此处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接