Java Flyweight模式:外在和内在状态?

时间:2014-05-18 16:09:11

标签: java design-patterns flyweight-pattern extrinsic-parameters

我对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

参考Wikipedia中关于文本编辑的例子。内在状态是字母,外在状态是字体,颜色等吗?

1 个答案:

答案 0 :(得分:5)

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

  

对于文档中的每个字符,可能需要a   包含字体轮廓,字体指标等的字形对象   格式化数据,但这将达到数百或数千   每个字符的字节数。相反,对于每一个角色都可能存在   对每个实例共享的flyweight字形对象的引用   文件中的相同字符;只有每个人的位置   需要存储字符(在文档和/或页面中)   内部。

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

从您的问题中,我认为您在示例中感到困惑的地方是什么可以被视为外在/内在属性。这可能是因为你描述的属性,字体样式,字体颜色和字体都将作为flyweight模式的一部分重新使用,因此它们是“内在的”,因为它们是flyweight模式的一部分,但是“extrinsic”in你应该考虑他们对特定字母的应用的意义。例如,在文字处理器中,您可能会有一组粗体,斜体等不同字体的字形;还可以应用和重用可用颜色的集合。然后程序将跟踪这些属性的应用位置,但它们不会像上面描述的那样是纯粹的外在状态。

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

您应该尝试获取原始gang of four book on design patterns的副本。本书详细介绍了文字处理器示例,并帮助您了解模式的工作原理。