Sam*_*ach 14 c# design-patterns flyweight-pattern
意图:
这种模式的目的是使用共享来支持大量具有部分内部状态的对象,其中状态的其他部分可以变化.
对象可以通过静态字段共享状态.
使用flyweight模式和使用静态字段共享大量对象的内部状态有什么区别?
flyweight通过其Factory提供的对象池是flyweight真正的全部内容吗?
Cha*_*ana 14
使用静态字段,在任何一个时间点只能使用一个对象实例.使用flyweight模式,您可以同时使用任意数量的不同实例(每个实例都使用多次).flyweight模式的规范示例适用于文本编辑器,您需要为文档中的每个字符实例化一个对象.然后,您只需要26个对象(假设文档仅使用小写字母),一个用于字母'a',一个用于字母'b',等等,而不是在10000字文档中为每个字符在内存中有一个对象.每次你需要执行一些需要'a'对象的功能或动作时,它们会在整个文档中一次又一次地重复使用.
编辑:从下面的第一条评论中回答问题:
因此,由于您需要26个不同的对象,因此创建Letter一个静态或单一的类是行不通的.如果它是静态的,则不能创建任何实例,因此无论静态值必须适合于您使用它的代码中的每个位置.如果它是单身,那么你当然只有一个对象.每次使用时,每个属性都必须可调整(和调整).要将此模式用于字母表中的字母,您必须有26个不同的类,每个字母一个...
此外," 可以改变的类的一部分 "实际上意味着某些字段表示对于类的每个实例都不同的状态.而共同的部分意味着这些公共字段的值对于匹配那些状态值的对象的所有使用是共同的(例如,所有的'a'),而不是对于类的每个实例.
再次,使用文本编辑器作为示例.您需要处理一个'a'字符所需的代码中的每个位置,首先,转到存储26个字符对象实例的数据结构,并获取'a'实例,您将首先修改/改变不同的属性(与其性质无关的属性为"a",但可能更改为字体大小,位置,颜色等),以匹配文档中此特定字符"a"的需求.
然后,您将利用该对象执行您需要执行的任何操作,然后将其返回到存储结构,以便在下次代码需要"a"时重用.
Flyweight模式用于避免大量非常相似的类的开销.编程中有些情况似乎需要生成大量的小类实例来表示数据.有时,如果您能够识别实例基本上相同,除了一些参数,您可以大大减少需要实例化的不同类的数量.如果您可以将这些变量移出类实例并将其作为方法调用的一部分传递,则可以通过共享它们来大大减少单独实例的数量.
在这种情况下,重要的是要记住,Flyweight是在一个C#仅仅是一些功率点图表上粗略草图的时代发明的.并且隐含地通过一些这些模式来通知语言的成熟度.C#包括班级成员......
使用一些静态成员声明非静态类比将整个类声明为静态更典型.静态字段的两个常见用途是保持已实例化的对象数的计数,或存储必须在所有实例之间共享的值.
更进一步,WPF技术推广了共享资源,结果通常只是声明性代码.
因此,如果您选择的语言是C#,则可能会建议您考虑针对该语言中已存在的固有属性的Flyweight模式.