我看不出“Multiton”和“Flyweight”模式之间有任何区别,请解释一下它们的不同之处。
这两种模式的结果相似,但这几乎是巧合。因为它们的意图不同。
对于我来说,享元模式的主要目的是通过共享状态来减少内存使用。
多例模式的主要意图是,当您使用相同的键获取实例时,始终返回完全相同的对象实例(单例)。
享元模式的经典示例是在文字处理器中,每个字母由一个对象表示,为了避免为每个字母创建许多对象,而只存在每个字母的一个实例。
可能可以通过使用多例来实现这一点,以确保以键“A”获取的表示“A”的对象的实例相同。在这种情况下,这两种模式确实看起来相似。
但是,享元模式并不要求只能存在单个实例(这是多例模式的要求)。因此,在文本处理器的实现中,仍然可以在每个文档中拥有每个字母对象的实例,这仍然会大大减少内存使用,并且我相信仍然是享元模式的一种实现,但不是多例模式,因为可以在不同文档中存在许多“ A”的实例。
您还可以在许多其他情况下使用享元模式来降低内存消耗,其中多例模式不适用。这可能不是一个完美的例子,但想象一下一个提供学校学生和他们所上课程列表的系统。如果有一个包含学生所上课程列表、班级,教师,可用设备等信息的学生对象。
在一个天真的模型中,学生可能会有一组Class对象,并且每个Class对象都会为每个学生创建新对象。你在每个学生身上存储了很多对象,这可能需要大量内存。相反,你可以使用享元模式(flyweight)来代替Class,并且仅在每个学生需要该课程时将其引用到相同的Class实例中。这将显著减少存储大量学生名单所需的内存。