我喜欢能够为可以使用的类提供默认值,但问题是如果它们被更改,那么它将影响对它的所有引用并且不会是“默认”。通过使用像这样的默认值,它可以节省内存,并允许默认值(如果需要)传播到所有使用默认值的引用。静态不可变的默认实例
一个简单的例子是
class A
{
static public A Default;
}
然后可以使用A.Default作为A的“默认”的实例同样,问题是,A是不是一成不变的或者至少是“冻结”并变为它会改变所有的参考。如果这是人们想要的行为,这可能很好,但如果默认情况下发生了意外更改,可能会造成严重破坏。
我真正需要的是一种深度冻结和解冻Default的方法。
很明显,一种方法是简单地让所有setter只在一个条件上设置并将collection标记为只读。提供这样简单的行为似乎有很多重复的工作。
有没有一个简单的库,模式或反射来完成这个?写入时复制能力会很好,所以如果试图改变Default,就会创建一个新的可变实例。不仅如此,即使flyweight实例可以创建,如果它有机会提高性能(更改的大小)。
示例:假设您最初创建1M个具有所有相同状态的大(内存大小)对象。通过使用默认模式,这只会创建1个实际的对象。假设你改变了所有状态的1个参数(比如位置),但对象本身非常大。使用flyweight模式,您只需1M个已更改的参数即可跟踪(较慢但内存较少),而不是1M个新对象。在改变了足够的参数之后,完整的对象最终被分配给它的引用。
这里有什么吗?
在什么情况下,你会想“解冻”默认与谁应该可以“解冻”默认? – shahkalpesh 2011-03-06 15:56:33
你确定你确实需要这个复杂的东西吗? – 2011-03-06 16:00:57
这似乎是一个设计缺陷。你有一个类A,当它的“Default”实例不可变时,它是不可变的。Perhapes你需要两个类,一个不可变和可变的,或者让你的类A成为一个结构体或值类型,比如object(即像String) – MerickOWA 2011-03-06 16:15:25