2 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
Run Code Online (Sandbox Code Playgroud)
参考维基百科中给出的关于文本编辑的示例.内在状态是字母,其外在状态是字体,颜色等?
flyweight模式是一种处理你想要完成的事情使用很多相同类型的对象的情况的方法.flyweight模式不是每次都创建一个新的对象实例,而是重用对象,只需要跟踪它们的使用差异.文字处理器是经典的例子.从您的维基百科示例:
对于文档中的每个字符,可能需要包含字体轮廓,字体度量和其他格式数据的字形对象,但是对于每个字符,这将达到数百或数千个字节.相反,对于每个字符,可能存在对文档中相同字符的每个实例共享的flyweight字形对象的引用; 只需要在内部存储每个字符(在文档和/或页面中)的位置.
这是对如何使用模式的准确描述.遵循内在/外在的区别,字形对象将是内在状态,并且这些对象的位置(例如,它们出现在哪个页面,段落和线上)将是对象的外在状态/用法.
从您的问题中,我认为您在示例中感到困惑的地方是什么可以被视为外在/内在属性.这可能是因为你描述的属性,字体样式,字体颜色和字体都将作为flyweight模式的一部分重新使用,因此它们是"内在的",因为它们是flyweight模式的一部分,但是"extrinsic"in你应该考虑他们对特定字母的应用的意义.例如,在文字处理器中,您可能会有一组粗体,斜体等不同字体的字形; 还可以应用和重用可用颜色的集合.然后程序将跟踪这些属性的应用位置,但它们不会像上面描述的那样是纯粹的外在状态.
至于你上面的代码我不知道它如何适应flyweight示例而没有看到它背后的任何代码.但据我所知,它看起来类似于您链接到的维基百科文章中的咖啡店示例.无论该值表示什么,该数字对于重用的对象是唯一的.
您应该尝试获取原始帮派的四本关于设计模式的书.本书详细介绍了文字处理器示例,并帮助您了解模式的工作原理.