享元模式——非共享具体实例的意义何在?

Flyweight pattern - What is the point of an unshared concrete instance?

众所周知,享元模式的UML图中有一个未共享的具体实例,它实现了享元接口。我的问题是,如果它的外部状态有点毫无意义,为什么要实现它呢?我的意思是,对于共享的具体实例,需要接口,所以你必须确保可以传递外部状态,但是非共享的呢?不实现接口就不能轻易达到同样的效果吗?

扩展享元接口提供了将客户端与享元模式实现分离的机会。

示例:

'Glyph'-s 实现了享元模式。 根据该模式的 UML,'Glyph' 表示 'Flyweight' 基础 class 或接口。 'Client' 使用一组字形。 FlyweightFactory(此处为 GlyphFactory)可以使用享元模式创建字形(通常是 SharedFlyWeightGlyph 对象实例)。

客户端可能将文本存储为一组字形。

现在假设,在普通字形旁边,您想使用 FlyWeightFactory 无法创建的一些自定义字形。通过扩展 'Glyph' 接口(根据该模式的 UML 图,它是 UnsharedFlyweight),您有机会使用自定义字形,但是,在这些情况下,无法利用享元模式的性能优势。

未共享的具体实例没有 intrinsic 数据共享,但它可以使用 extrinsic "data" 来生成它的操作输出,因此它实现了相同的接口。

此模式的主要目的是节省存储空间 space,有效地使用大量对象。

内在状态是不变的(与上下文无关),因此可以共享。外部状态是可变的(依赖于上下文),因此不能共享,必须传入。

卡片示例。我们必须跟踪大量的手牌和他们的分数;上下文是手牌,共享实例是标准牌,非共享对象是王牌。标准卡片的 points() 方法的输出取决于其内在数据(套件和等级)和手牌。小丑的 points() 取决于手牌和特定选择,它既不是内在的,也不是外在的。