我今天遇到了一个问题,一位朋友建议我使用全局静态实例或更优雅地使用单例模式.我花了几个小时阅读关于单身的事情,但有些事情仍然让我感到厌烦.
背景:我想要完成的是创建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)
我收到一条错误消息,说我无法启动多个实例.
为什么不在您的单身人士中添加公共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)
| 归档时间: |
|
| 查看次数: |
9072 次 |
| 最近记录: |