.NET中的单例约定

时间:2013-09-16 19:08:56

标签: .net design-patterns coding-style singleton

在.NET中实现单例模式时是否有使用属性或方法的约定?

我无法想出使用其中一种方法的任何理由,除了方法可能会在将来接受参数。

3 个答案:

答案 0 :(得分:2)

文章Choosing Between Properties and Methods对通用方案有一些很好的建议。问题是延迟初始化会使主题有点笼罩。

一方面,你有这些论据表明它可能是一个财产。

  • 单身只是一段数据。
  • 延迟初始化不符合可观察的副作用。他们这里的关键词是“可观察的”。换句话说,刚刚创建单例或已经创建单例的事实是从调用者的角度进行封装的。

另一方面,你有这些论据表明它可能是一种方法。

  • 需要复杂初始化的单例可能非常耗时。一般而言,耗时的操作是作为方法实现的。
  • 如果单例创建可能会抛出瞬态异常(数据库连接,网络上的文件操作等),那么如果使用某个方法,一些调用者可能会更好地欣赏它。

我看过单身人士都是双向实施的。最后,您的决定不会对您的其他应用程序产生巨大影响,因此这可能是一个没有实际意义的讨论。然后,如果这是您公开的API的一部分,那么该决定确实具有一定的重要性。主要的是考虑呼叫者将如何对您的决定做出反应。例如,大多数开发人员(通常无意识地)假设属性是无异常的,因此如果您的单例创建可能会抛出,那么最好使用GetInstance()方法。否则,拥有Instance属性可能是更好的路径。

要考虑的另一件事是单例是否将用于WPF或Silverlight的XAML绑定。通常,您将公共属性绑定到XAML元素,因此在这种情况下,尽管使用方法方法的参数,但将单例作为属性实现将是更好的路径。

答案 1 :(得分:1)

一般来说,Singleton的大多数“标准化”示例都使用属性,底层实例是通过Lazy<T>创建的。

鉴于单例通常只返回一个实例,一个(get only)属性与期望值匹配。

答案 2 :(得分:1)

由于两个 MSDN 原因,您可以使用属性: -

  

这种实现有两个主要优点:

     
      
  • 因为实例是在Instance属性方法中创建的,所以该类可以执行其他功能(for   例如,实例化一个子类),即使它可能会引入   不受欢迎的依赖。
  •   
  • 在对象请求实例之前不执行实例化;这种方法被称为惰性实例化。当&gt;应用程序启动时,延迟实例化避免实例化不必要的单例。
  •