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

Gee*_*eek 7 java design-patterns flyweight-pattern

从Four of Gang中的FlyWeight Pattern 一章开始,FlyWeight模式适用于大多数对象状态可以是外在的.

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

use*_*577 8

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

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


use*_*298 6

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

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


Mar*_*nik 2

无论该项目符号列表中的具体措辞如何,理解该消息都很重要:Flyweight适用于状态的重要部分可以在许多对象之间共享的情况,因为它是一些对所有对象都相同的数据。通常,共享状态本质上是不可变的(即“普遍真理”)。字体的例子清楚地表明了这一点;日常 Java 的一个例子是java.util.regex.Pattern,即享元,与Matcher,即重用它并保存本地外部状态的客户端对象。许多Matchers 可以并行存在,所有这些都在内部重用已编译的正则表达式。

这句话使事情比你的问题中的更清楚:

共享的享元越多,节省的存储空间就越大。节省的费用随着共享状态数量的增加而增加。当对象使用大量的内在和外在状态并且外在状态可以被计算而不是被存储时,就会产生最大的节省。然后,您可以通过两种方式节省存储空间:共享可以降低内在状态的成本,并且可以用外在状态换取计算时间。