3

我对模式的这些状态的差异感到困惑Flyweight

我知道intrinsic状态是共享的状态,而Extrinsic不是共享的状态。

但是,我看不到extrinsic状态在模式或以下示例中的重要性:

public static void main(String[] args) {
        // Create the flyweight factory...
        EngineFlyweightFactory factory = new EngineFlyweightFactory();
        // Create the diagnostic tool
        DiagnosticTool tool = new EngineDiagnosticTool();
        // Get the flyweights and run diagnostics on them
        Engine standard1 = factory.getStandardEngine(1300); //intrinsic
        standard1.diagnose(tool); //extrinsic

        Engine standard2 = factory.getStandardEngine(1300); //intrinsic
        standard2.diagnose(tool); //extrinsic

        Engine standard3 = factory.getStandardEngine(1300); //intrinsic
        standard3.diagnose(tool); //extrinsic

        Engine standard4 = factory.getStandardEngine(1600); //intrinsic
        standard4.diagnose(tool); //extrinsic

        Engine standard5 = factory.getStandardEngine(1600); //intrinsic
        standard5.diagnose(tool); //extrinsic

参考维基百科中关于文本编辑器的示例。内在状态是字母,外在状态是字体、颜色等吗?

4

1 回答 1

6

享元模式是一种处理您要完成的任务使用大量相同类型对象的情况的方法。享元模式不是每次都创建一个新的对象实例,而是重用对象,只需要您跟踪它们的使用差异。文字处理器就是典型的例子。从您的维基百科示例:

对于文档中的每个字符,可能需要一个包含其字体轮廓、字体度量和其他格式数据的字形对象,但这对于每个字符来说将达到数百或数千字节。取而代之的是,对于每个字符,可能会引用文档中同一字符的每个实例共享的享元字形对象;只有每个字符的位置(在文档和/或页面中)需要在内部存储。

这是对如何使用模式的准确描述。根据您的内在/外在区别,字形对象将是内在状态,而这些对象的位置(例如,它们出现在哪个页面、段落和行上)将是对象的外在状态/使用。

根据您的问题,我认为您在示例中感到困惑的是什么可以被视为外在/内在属性。这可能是因为您描述的属性、字体样式、字体颜色和字体都将作为享元模式的一部分被重用,因此它们是“内在”的,因为它们是享元模式的一部分,但在“外在”感觉你会解释它们对特定字母单词的应用。例如,在文字处理器中,您可能会有一组用于粗体、斜体等不同字体的字形;一组可用的颜色也可以应用和重复使用。然后程序将跟踪这些属性的应用位置,但它们不会是您上面描述的纯外部状态。

至于您上面的代码,我不确定它如何适合 flyweight 示例,而没有看到它背后的任何代码。但据我所知,它看起来类似于您链接到的维基百科文章中的咖啡店示例。无论该值代表什么,该数字对于重用的对象都是唯一的。

您应该尝试获得一本关于设计模式的四本原版书籍。这本书非常详细地介绍了文字处理器示例,我可以帮助您更多地了解该模式的工作原理。

于 2014-05-18T16:35:39.803 回答