2010-08-10 64 views
6

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

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

通过从中派生出来并使私有构造者公开,我使用c#?

或者在这里可以有其他想法?

谢谢

+7

@AndréPena:请不要使用标签来侮辱人或他们的问题。 – BoltClock 2010-08-10 19:10:14

+0

奇怪的情况。请澄清情况。最好的解决办法是避免单身...... – Shlomo 2010-08-10 19:10:16

+1

这种情况下的“最佳做法”是从中学习:你的单身人士永远不应该是单身人士。请记住,下次你试图做一个单身人士。 – jalf 2010-08-10 19:57:25

回答

12

应该只有一个单身人士。如果你有多个,它不是一个Singleton。

也许Multiton是你想要的吗?

+0

+1从来没有听说过这种模式!看起来很有趣。 – BoltClock 2010-08-10 19:10:30

+0

这正是我所需要的,从来没有听说过。 – 2010-08-10 19:39:08

+1

单身人士意味着每______(关键或其他标准)一个实例。 multiton模式不包含单例模式不包含的任何内容。维基百科文章同意:“大多数人和教科书都认为这是一种单身模式。” – 2011-05-18 19:57:07

13

简单:不要让它成为单身。单词'single'是有原因的。

4

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

3

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

+0

喜欢你的答案,但multiton正是我所需要的。 – 2010-08-10 19:39:47

0

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

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

1

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

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

如果这个类有一个公共构造函数,并且单例使用只是一个指导,但不是强制执行,那么您可以创建尽可能多的实例。

但是请注意,如果该类被设计为单例,它的实现很可能在内部进行了这种假设,因此具有多个实例可能会产生意想不到的副作用。你应该确保这个类已经实现,以便允许这样的使用场景。

1

一个Singleton是一种设计模式,它为您提供了两个确保:

  • 恰好类的一个实例会存在,而且
  • 此项目是全局访问。

如果您删除第一个要求,您拥有的不再是单身人士。这是一个普通的,老式的global

所以称其为真名。你需要的是一个简单的全局变量。如果你需要它,你可以用一些懒惰的初始化逻辑来包装它,但它是全局的,而不是单一的。

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