1

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

4

2 回答 2

1

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

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

请参阅评论。这里的不变状态。

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

于 2019-02-13T12:34:58.843 回答
1

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

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

于 2019-02-13T16:01:28.157 回答