Flyweight模式中描述的内在和外在状态之间有什么区别?

从“ 四人帮”中的FlyWeight模式章节开始, FlyWeight模式适用于大多数对象状态可以是外在的

extrinsic state意味着什么? 我感觉这个模式用于共享对象。 如果要共享对象,那么该对象如何甚至可以拥有任何状态?

无论该项目符号列表中的具体措辞如何,理解该消息非常重要: Flyweight适用于可以在许多对象之间共享数据的重要部分的情况,因为它是不可变的。 带有字体面的例子非常清楚; 日常Java java.util.regex.Pattern一个例子是java.util.regex.Pattern ,它是不可变外在状态的持有者,而Matcher是重复使用并保持局部内在状态的轻量级。 许多Matcher可以并行存在,所有都在内部重用编译的正则表达式。

这句话让事情比你问题中的那些更清晰:

共享的flyweights越多,存储空间就越大。 随着共享状态的数量,节省增加。 当对象使用大量的内在和外在状态时,可以实现最大的节省,并且可以计算外部状态而不是存储外部状态。 然后以两种方式节省存储:共享降低了固有状态的成本,并且您将外部状态换成计算时间。

我们来看一个Word处理器的例子:

Word处理器处理Character对象。 Character对象的状态是字符内容,字体,样式,位置等(就字处理器而言)。 不同的文档使用不同的字符实例。 假设我们只处理az字符,不同的文档使用来自az池的字母,但可能会应用不同的字体/样式。 因此,如果我们将字符的内容与字体/样式分开,我们可以共享这些字符,这是有道理的,因为与使用的字符的不同实例相比,总的不同类型的字符更少(在我们的情况下为26但在其他情况下为常量)在不同的文件中。 共享这些字符实例意味着明智地共享Character实例内容,并在外部对这些字符应用字体/样式等上下文。 字符内容是内在状态,字体/样式是外在状态。 将状态分为内在和外在状态导致上述示例中的大量存储节省。

外在 – 属于对象上下文(外部)或该实例唯一的外部状态

内在 – 自然属于’FlyWeight’对象的状态,因此应该是永久的或不可变的(内部的)或无上下文的。