我有一个由另一个库实例化的类。我无法控制该库代码,但仍需要确保它不能创建我的类的多个实例。
有可能吗?怎么样?
答案 0 :(得分:4)
这个问题的一些简单解决方案隐藏了一些问题,为了充分理解这个问题,我建议阅读以下文章
http://www.yoda.arachsys.com/csharp/singleton.html
以最佳解决方案结束
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
答案 1 :(得分:1)
如果它正在调用您的类的构造函数,那么您唯一能做的就是在构造函数中抛出异常(如果您确定先前已创建实例)。由于您无法控制其他库,因此您将无法使用工厂方法或静态属性,这通常是您控制对单例的访问的方式。
根据您的具体情况,您还可以考虑使用包装单例实例的轻量级代理。在此示例中,可以创建任意数量的MyObjectProxy,但它们都将其实现推迟到MyObject的单个实例。
public class MyObject {
internal MyObject() {
}
private int _counter;
public int Increment() {
return Interlocked.Increment(ref _counter);
}
}
public class MyObjectProxy {
private static readonly MyObject _singleton = new MyObject();
public MyObjectProxy() {
}
public int Increment() {
return _singleton.Increment();
}
}