multiton模式vs flyweight模式

时间:2014-10-15 11:09:35

标签: design-patterns architecture flyweight-pattern

我看不出MultitonFlyweight模式之间的任何单一差异。请解释一下有什么区别?

1 个答案:

答案 0 :(得分:7)

模式有类似的结果,但这几乎是巧合,因为意图不同。

对我来说,flyweight的主要目的是通过共享状态来减少内存。

multition的主要目的是在使用相同的密钥获取实例时始终具有与返回的对象完全相同的实例(单例)。

  • Multition
    • 保证对于任何键只存在一个对象实例,例如每个键的单例模型
  • 飞锤
    • 通过在对象之间共享状态来减少内存消耗。

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

可以通过使用multition来实现这一点,该multition确保对于键'A',返回表示'A'的对象的相同实例。在这种情况下,模式确实看起来都很相似。

但是,flyweight不要求只存在单个实例(对多重模式的要求)。因此,也可以使用文字处理器的实现,其中每个文档都有一个每个字母对象的实例。

这仍然会大量减少内存量,我相信它仍然是flyweight模式的一个实例,但不会是多重模式,因为字母“A”的许多实例可能存在于不同的文档中。 / p>

在多种模式不适用的许多其他情况下,您还可以使用flyweight模式来减少内存消耗。这可能不是一个完美的例子,但想象一个系统,它提供学校的学生名单和他们所学的课程。如果你有一个学生对象,其中包含学生所选课程的列表,课程列出了房间,教师,可用设备等等。

在幼稚模型中,学生可能拥有一组Class对象,并且每个Class对象都将为每个学生创建。您在每个学生上存储了许多对象,这可能需要大量内存。相反,您可以为Class使用flyweight,并且只存储每个接受该类的学生中相同Class实例的引用。这将大大减少存储大量学生所需的内存。

但是类实例可能不适合作为单例,因为类本身是数据驱动和动态的(可以添加和删除新类等),因此多重模式不适合这里。