Как говорят некоторые другие ответы, Реализация шаблона Singleton в C # является одним из лучших ресурсов для Singletons в целом.
Если вы хотите, чтобы ваш singleton был выпущен, когда на него нет ссылокВ другом месте вы можете убрать свой любимый шаблон с вышеупомянутого сайта и поместить его в 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 иногда является членом определенных классов, которые вы проходите.