最近,有人针对单身人士进行了某种革命,但是如果他们是无国籍的,他们有什么问题吗?
我知道过度使用的话题以及所有...这不仅适用于单例,还适用于所有情况。
最近,有人针对单身人士进行了某种革命,但是如果他们是无国籍的,他们有什么问题吗?
我知道过度使用的话题以及所有...这不仅适用于单例,还适用于所有情况。
Answers:
> Are immutable/stateless singletons bad?
有关更多详细信息,请参见洋葱架构
我看不出不使用Singletons的其他原因。
它始终取决于用法。我认为革命来自于一个事实,即每一个程序员学习这种模式为的面向对象模式。大多数人忘记考虑在哪里有意义,在哪里没有意义。
当然,每种模式都适用。仅仅通过使用模式,就不能创建好的代码或好的软件。
如果您有无状态单身人士,为什么不使用仅提供静态方法的类(或使用静态类)?
这里有一些关于全局变量和单例的文章。
我不会像作者那样严格,但是他表明,在大多数情况下,您认为需要单身人士,实际上并不需要。
一个不变的无状态单例不能做静态类不能做的事情。
根本没有理由增加-> Instance()创建的额外复杂性,而对静态方法的普通调用将更加清晰,在资源方面更为保守并且可能更快。
不是说他们错了。这是一种更好的方法。在某些情况下,正常(“有状态”)单例是正确的方法。单例的弊端是它们经常被滥用,其结果与全局变量相同,但在某些特定情况下,使用单例是正确的。对于无国籍者,没有这样的情况。
单例的主要问题在于,当在跨领域关注方案中使用时,它会隐藏依赖关系并特别是耦合。有关更多信息,请参阅“ 单身人士是病态的骗子”或“ 为什么单身人士是邪恶的 ”。
另一方面,如果不滥用状态,减少单身状态可能会有所帮助并提高性能。考虑一个例子:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
在此,StatelessSingleton充当接口的默认实现,并放入User构造函数中。没有硬编码的耦合和隐藏依赖性。由于底层接口,我们无法使用静态类,但是没有理由创建多个默认实例。这就是为什么无状态单身似乎是一个适当的选择的原因。
但是,也许我们应该对默认实现使用另一种模式:
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
它达到了StatelessSingleton的性能,但构成了接口的通用实现。IProgress接口使用类似的解决方案。
再一次,为什么允许创建多个默认行为实现?但是我们可以将两者结合起来:
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
总之,我相信在某些地方(如所描述的默认设置),单例有用。Singleton的主要定义指出,不允许创建一个类的多个实例。这是核能。可以产生能量或炸弹。这取决于人类。