使用单例而不是全局静态实例

Rya*_*yan 8 c# singleton

我今天遇到了一个问题,一位朋友建议我使用全局静态实例或更优雅地使用单例模式.我花了几个小时阅读关于单身的事情,但有些事情仍然让我感到厌烦.

背景:我想要完成的是创建API的实例并在我的所有类中使用这个实例(而不是建立新的连接等).

似乎有大约100种创建单例的方法,但在yoda的帮助下,我发现了一些线程安全的例子...还给出了以下代码:

public sealed class Singleton
{
     public static Singleton Instance { get; private set; }

     private Singleton()
     {
        APIClass api = new APIClass();  //Can this be done?
     }

     static Singleton() { Instance = new Singleton(); }
}
Run Code Online (Sandbox Code Playgroud)

如何/在哪里实例化这个新类以及如何从一个单独的类中调用它?

编辑:我意识到可以用类似的东西调用Singleton类

Singleton obj1 = Singleton.Instance();
Run Code Online (Sandbox Code Playgroud)

但是我能够访问API类中的方法(即obj1.Start)吗?(不是我需要,只是问)

编辑#2:我可能在检查答案时有点过早,但我确实有一件小问题仍在引起我的问​​题.API发布很好,遗憾的是我能够启动两个实例吗?

新规范

public sealed class SingletonAPI
{
 public static SingletonAPI Instance { get; private set; }

 private SingletonAPI() {}

 static SingletonAPI() { Instance = new SingletonAPI(); }     

 // API method:
 public void Start() { API myAPI = new API();}
 }
Run Code Online (Sandbox Code Playgroud)

但如果我尝试做这样的事......

SingletonAPI api = SingletonAPI.Instance;
api.Start();
SingletonAPI api2 = SingletonAPI.Instance;  // This was just for testing.
api2.Start();
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,说我无法启动多个实例.

Igb*_*man 9

为什么不在您的单身人士中添加公共APIClass属性?

public sealed class Singleton
{
     public static Singleton Instance { get; private set; }

     private APIClass _APIClass; 

     private Singleton()
     {
        _APIClass = new APIClass();  
     }

     public APIClass API { get { return _APIClass; } }

     static Singleton() { Instance = new Singleton(); }     
}
Run Code Online (Sandbox Code Playgroud)

然后你的呼叫网站看起来像:

Singleton.Instance.API.DoSomething();
Run Code Online (Sandbox Code Playgroud)

或者,如果您是API类的作者,您可以将其设置为单例,而不是将其包装在单例中:

public sealed class SingletonAPI
{
     public static SingletonAPI Instance { get; private set; }

     private SingletonAPI() {}

     static SingletonAPI() { Instance = new SingletonAPI(); }     

     // API method:
     public void DoSomething() { Console.WriteLine("hi"); }
}
Run Code Online (Sandbox Code Playgroud)

API调用:

SingletonAPI.Instance.DoSomething();
Run Code Online (Sandbox Code Playgroud)


Jam*_*ate 5

这是Microsoft官方方法.

单例的优点在于您可以在代码中的任何位置使用和访问它,而无需创建类的实例.事实上,这是存在的理由,例如,一个类的单个实例

Singleton.Instance.MyValueSingleton.Instance.DoSomething();