单例类的几个实例

时间:2010-08-10 19:01:52

标签: c# .net design-patterns

我有一些类,它是一个单例,我们在几个应用程序中有这个类,它在那里用作单例。

现在我正在编写一些新的应用程序,我需要该类的几个实例,拥有它的sevaral实例的最佳实践是什么?

通过从中推导并使私有构造变得公开,我使用c#?

或者在这里还有其他想法?

由于

7 个答案:

答案 0 :(得分:13)

简单:不要让它成为单身人士。 “单身”这个词是有原因的。

答案 1 :(得分:12)

应该只有一个单身人士。如果您有多个,则不是单身人士。

也许你想要Multiton

答案 2 :(得分:4)

在我看来,如果你需要这个类的几个实例,那么你会像其他任何一个一样处理它,你会删除类中任何强制它成为单例的东西,然后它就会停止单身人士。

答案 3 :(得分:3)

您可以考虑一个可配置的工厂类,以便始终返回相同的实例,或者根据配置或其他条件为您提供不同的实例。

答案 4 :(得分:1)

这实际上取决于如何将类实现为单例。

如果类具有私有默认构造函数并且单例实例是通过静态工厂方法创建的,那么您唯一的选择是从类派生(只要它没有被密封)并在派生类上提供公共构造函数创建多个实例。

如果类具有公共构造函数,并且单例用法只是一个指导,但没有强制执行,则可以创建尽可能多的实例。

但是请注意,如果将类设计为单例,则很可能其实现在内部进行该假设,因此具有多个实例可能会产生意外的副作用。您应该确保实现该类,以便允许这样的使用场景。

答案 5 :(得分:1)

单身是一种设计模式,为您提供两种保证:

  • 该类的一个实例将存在,
  • 此实例可全局访问。

如果删除第一项要求,您拥有的不再是单身。这是一个简单的,老式的全球

所以用它的真名来称呼它。你需要的是一个简单的全局变量。如果需要,可以将它包装在某种惰性初始化逻辑中,但它是全局的,而不是单例。

除此之外,Singletons are a really really bad idea。首先不要使用它们。

答案 6 :(得分:0)

你所要求的是非常矛盾的 - 你能否定义Singleton的意思,以确保我们没有使用不同的词汇?

如果现有对象是真正的静态单例,那么您可能无法实例化多个实例;为了做到这一点,你需要在他们自己的AppDomain中加载每个实例(以及它的调用者),这不是微不足道的,并且只是为了得到多个单身人士,这将是一个非常大的权衡/黑客。