【问题标题】:Flyweight pattern objects are immutable?享元模式对象是不可变的?
【发布时间】:2019-02-13 12:19:06
【问题描述】:

我们知道,Java实习生字符串池是基于享元设计模式的。 String 对象也是不可变的。是否强制所有使用享元模式的对象都是不可变的? . Flyweight模式中的可变对象和不可变对象有什么区别?

【问题讨论】:

  • 因为对象可能在线程之间共享。因此,为避免任何并发修改,您必须拥有不可变对象。也许还有其他原因,但这是我能想到的主要原因。
  • disagree Java 的字符串池是基于享元模式的。

标签: java design-patterns immutability flyweight-pattern


【解决方案1】:

请记住,GoF 设计模式是从 1980 年代左右编写的代码中收集的。可变性不是今天的问题。考虑到这一点,他们的所有模式都支持可变状态。 GoF 书中关于可变性的单个注释是对删除复合叶节点的传递引用。我会将本书中的所有其他对象引用解释为可能是可变的。

这并不意味着可变性是可取的,或者模式不能是不可变的。确实,不变性是在设计模式中应用的一个很好的特性,原因与它在其他地方很好用的所有相同的原因。但这在 GoF 中从来都不是强制性的。

【讨论】:

    【解决方案2】:

    是否强制所有使用享元模式的对象都是不可变的

    您可以实现一些看起来像享元的东西,但您的对象很可能是可变的。我认为这是一个糟糕的实现。

    参见 cmets re。不变状态here

    不变性当然是可取的,这取决于享元模式的使用性质。您的客户可能不知道他们请求/创建的对象实际上与其他组件或线程共享,并且在这种情况下拥有可变对象很可能会出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多