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