Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 这是单例模式的真正实现吗?_Asp.net_Design Patterns_Singleton - Fatal编程技术网

Asp.net 这是单例模式的真正实现吗?

Asp.net 这是单例模式的真正实现吗?,asp.net,design-patterns,singleton,Asp.net,Design Patterns,Singleton,到目前为止,我读过的关于单例模式的所有教程如下: public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton(){} public static Singleton Instance { get { return in

到目前为止,我读过的关于单例模式的所有教程如下:

 public sealed class Singleton
 {
      private static readonly Singleton instance = new Singleton();

      private Singleton(){}

      public static Singleton Instance
      {
         get 
         {
            return instance; 
         }
      }
 }
但我在程序集中已经有了一个类,在应用程序生命周期中,我只需要它的一个实例。我不知道如何使用上面提到的模式

例如,假设dll中有一个名为Y的类X。下面的代码是否正确:

 public sealed class Singleton
 {
      private static readonly Y.X instance = new Y.X();

      private Singleton(){}

      public static Y.X Instance
      {
         get 
         {
            return instance; 
         }
      }
 }

这是真正的单身汉吗?如果没有,什么是处理这种情况的正确方法?

我会使用以下方法:

public static class Singleton<T>
   where T : new()
{
    private static readonly Lazy<T> instance = new Lazy<T>();

    public static T Instance
    {
        get
        {
            return instance.Value;
        }
    }
}
公共静态类单例
其中T:new()
{
private static readonly Lazy instance=new Lazy();
公共静态T实例
{
得到
{
返回instance.Value;
}
}
}
其思想是使用泛型,以便允许指定任何类型作为类型参数

lazy只是实例化对象实际实例的一个改进


请注意,这不会禁止直接创建t的实例…

不,它不是单例模式。您正在调用新的Y.X()意味着任何人都可以调用它。这并不特别禁止Y.X()的新实例

但是,如果需要确保在应用程序中只引用一个Y.X实例,那么代码是可以的。然后您可以通过调用Singleton.Instance来获得它


这实际上是工厂模式(一个专门用于创建对象的类),我建议您调用类XFactory或类似的东西,而不是singleton。

谢谢,不,我不直接使用Y.X。但我需要确保每次实例化类“SingleTon”时,其实例属性都引用第一个创建的Y.X对象。不是新的。