【发布时间】:2014-10-15 20:24:43
【问题描述】:
我看不出Multiton 和Flyweight 模式之间有任何区别。请解释一下有什么区别?
【问题讨论】:
标签: design-patterns architecture flyweight-pattern
我看不出Multiton 和Flyweight 模式之间有任何区别。请解释一下有什么区别?
【问题讨论】:
标签: design-patterns architecture flyweight-pattern
这些模式具有相似的结果,但这几乎是巧合,因为意图不同。
对我来说,享元的主要目的是通过共享状态来减少内存。
multition 的主要目的是在您使用相同的键获取实例时始终返回完全相同的对象实例(单例)。
享元的经典示例是在文字处理器中,其中每个字母都由一个对象表示,为了避免为每个字母创建多个对象,每个字母只存在一个实例。
可以通过使用确保键“A”返回表示“A”的对象的相同实例来实现这一点。在这种情况下,模式确实看起来很相似。
但是享元没有要求只能存在一个实例(多模式的要求)。因此,也有可能实现一个文字处理器,其中每个文档的每个字母对象都有一个实例。
这仍然会大大减少内存量,我相信仍然是享元模式的一个实例,但不会是多重模式,因为字母“A”的许多实例可能存在于不同的文档中。
您还可以使用享元模式来减少在许多其他不适用多重模式的情况下的内存消耗。这可能不是一个完美的例子,但想象一个系统,它提供学校的学生名单和他们参加的课程。如果您有一个学生对象,其中包含学生参加的课程列表,并且课程列出了房间、老师、可用设备等。
在一个简单的模型中,学生可能有一个 Class 对象的集合,并且每个 Class 对象都会为每个学生创建新的。您在每个学生身上存储了许多对象,这可能需要大量内存。相反,您可以对 Class 使用享元,并仅在每个参加该课程的学生中存储对同一 Class 实例的引用。这将显着减少存储大量学生列表所需的内存。
但 Class 实例可能不适合作为单例,因为类本身是数据驱动的和动态的(可以添加和删除新类等),因此这里不适合使用 multition 模式。
【讨论】: