如何实现Singleton,以便在不使用所有引用时释放/处置对象实例?当任何身体想要一个Singleton实例时,它会根据需要延迟加载。
答案 0 :(得分:7)
单身人士不应动态处置:一旦创建,它们就会存在,直到应用程序的生命周期结束。 Singleton意味着只有一个实例。
即使您的Singleton保留了您想要动态释放和重新保留的资源,也不应该销毁并重新创建Singleton实例。这与模式的常见含义和用法相矛盾,模式可能(最多)导致团队中的沟通问题,或者(最坏的情况下)应用程序中的微妙错误。
相反,您可以让Singleton对象在内部管理该资源:如果它已经使用了一段时间,或者如果它的引用计数降为0,则释放它。
您还应该考虑使用Factory来访问该资源。这使您可以更自由地控制相关资源的处理。您还可以在内部重复使用创建的对象,实际上将对象计数保持在最多1。
答案 1 :(得分:4)
正如其他一些答案所说,Implementing the Singleton Pattern in C#是单身人士最好的资源之一。
如果你希望你的单身人士在其他任何地方都没有被引用时被释放,你可以从上述网站中取出你最喜欢的模式并将实例包装成WeakReference,例如:
public sealed class Singleton
{
static private readonly WeakReference _instanceReference =
new WeakReference(Singleton.LoadInstance());
static public Singleton Instance
{
get { return Singleton.GetInstance(); }
}
static private Singleton() { }
static private Singleton LoadInstance()
{
// load from expensive resource;
return new Singleton();
}
static private Singleton GetInstance()
{
Singleton result = _instanceReference.Target as Singleton;
if (result == null)
{
// TODO: consider thread safety
result = LoadInstance();
_instanceReference.Target = result;
}
return result;
}
private Singleton()
{
//
}
}
请注意,消费者很可能只会调用您的Singleton.Instance
并且不会自己创建引用,这意味着您的资源会经常重新加载。我想如果Singleton Instance有时会成为您传递的某些类的成员,那么这种模式效果最好。
答案 2 :(得分:3)
来自Implementing the Singleton Pattern in C#:
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
就发布部分而言,它与单例模式相矛盾,因为如果你下次有人试图访问它时释放实例,它将获得一个违反单例模式的新实例。
答案 3 :(得分:2)