- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
Intent:
The intent of this pattern is to use sharing to support a large number of objects that have part of their internal state in common where the other part of state can vary.
对象可以通过静态字段共享状态。
使用享元模式和使用静态字段共享大量对象的内部状态有什么区别?
享元通过其工厂提供的对象池是享元的真正含义吗?
最佳答案
使用静态字段,在任何一个时间点只能有一个对象实例在使用中。使用享元模式,您可以同时使用任意数量的不同实例(每个实例都被多次使用)。享元模式的典型示例是文本编辑器,您需要为文档中的每个字符实例化一个对象。一个 10,000 字文档中的每个字符都不需要在内存中有一个对象,那么您只需要 26 个对象(假设文档只使用小写字母),一个用于字母“a”,一个用于字母“b”,等等., 并且它们在整个文档中被短暂地、一遍又一遍地重复使用,每次您需要执行需要“a”对象的某些功能或操作时。
编辑:回答下面第一条评论的问题:
因此,由于您需要 26 个不同的对象,因此创建静态或单例的 Letter
类是行不通的。如果它是静态的,则您不能创建任何实例,因此无论静态值如何,都必须适合您使用它的代码中的每个地方。如果它是一个单例,那么你当然只有一个对象。每次使用时,每个属性都必须是可调整的(和已调整的)。要将此模式用于字母表中的字母,您必须有 26 个不同的类,每个字母一个...
此外,“类的可以变化的部分”实际上意味着某些字段代表类的每个实例的不同状态。而公共(public)部分意味着那些公共(public)字段的值对于匹配这些状态值(例如所有'a')的对象的所有使用都是公共(public)的,而不是对于每个实例类(class)。
再次以文本编辑器为例。代码中每个需要处理“a”字符的地方,首先,转到存储 26 个字符对象实例的数据结构,并获取“a”实例,您将首先修改/更改 varying 属性(这些属性与它作为“a”的性质无关,但可能与它的字体大小、位置、颜色等相关)以满足此需求文档中的特定字符“a”。
然后,您可以利用该对象做任何您需要用它做的事情,然后将它返回到存储结构,以便下次您的代码需要“a”时重用。
关于c# - 了解享元模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23684037/
据我所知,对象池是一种创建模式,享元是一种结构模式,但实际上我看不出两者之间有太大区别。有人可以向我解释它们之间的区别以及每种方法在实现中何时有用吗? 最佳答案 一个区别在于享元通常是不可变的实例,而
字符串已经在使用享元设计模式。汇集常见的 String 对象是否有益/性能好?因为字符串已经从字符串池中提取出来了吗? 最佳答案 字符串可以来自很多地方,默认情况下只有字符串文字在字符串池中。例如,当
我是一名优秀的程序员,十分优秀!