Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns multiton图案与flyweight图案_Design Patterns_Architecture_Flyweight Pattern - Fatal编程技术网

Design patterns multiton图案与flyweight图案

Design patterns multiton图案与flyweight图案,design-patterns,architecture,flyweight-pattern,Design Patterns,Architecture,Flyweight Pattern,我看不出Multiton和Flyweight模式之间有任何区别。请解释一下区别是什么?这些模式有相似的结果,但这几乎是巧合,因为目的不同 对我来说,flyweight的主要目的是通过共享状态来减少内存 multition的主要目的是在使用相同的键获取实例时,始终返回完全相同的对象实例(单例) 多离子 保证任何键只存在一个对象实例,就像每个键一个实例模型一样 飞锤 通过在对象之间共享状态减少内存消耗 flyweight的经典示例是在字处理器中,每个字母由一个对象表示,为了避免为每个字母

我看不出
Multiton
Flyweight
模式之间有任何区别。请解释一下区别是什么?

这些模式有相似的结果,但这几乎是巧合,因为目的不同

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

multition的主要目的是在使用相同的键获取实例时,始终返回完全相同的对象实例(单例)

  • 多离子
    • 保证任何键只存在一个对象实例,就像每个键一个实例模型一样
  • 飞锤
    • 通过在对象之间共享状态减少内存消耗
flyweight的经典示例是在字处理器中,每个字母由一个对象表示,为了避免为每个字母创建多个对象,每个字母只存在一个实例

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

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

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

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

在一个简单的模型中,学生可能有一个类对象的集合,每个类对象将为每个学生创建新的。您在每个学生身上存储了许多对象,这可能需要大量内存。相反,您可以为该类使用flyweight,并在每个接受该类的学生中仅存储对同一类实例的引用。这将大大减少存储大量学生所需的内存

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