Для удаления экземпляра также создайте метод статической выгрузки (аналогично AppDomain).Имейте реализацию вызова метода unload IDisposable, который уменьшает счетчик, используя Interlocked.Decrement, а также избавляется от экземпляра.
(я предполагаю, что если вы ограничиваете количество экземпляров, которыми у вас есть ресурсы для управления этим экземпляром.)
Вы также можете использовать обобщенные элементы, чтобы разрешить повторное использование класса фабрикиограничивающие экземпляры разных классов.Используйте ограничения, чтобы требовать экземпляр для реализации IDisposible и иметь конструктор по умолчанию.Также предоставьте нестатическое свойство для возврата фактического экземпляра.
public class foo : IDisposable
{
public foo() { ; }
public string Name;
public void Dispose() { ; }
// Real class would free up instance resources
}
LimitedInstance< foo > li = LimitedInstance< foo >.CreateInstance();
li.Instance.Name = "Friendly Name for instance";
// do stuff with li
LimitedInstance< foo >.UnloadInstance( ref li );
Единственная проблема в том, что вы не можете перегрузить оператор присваивания в C #.Поэтому, если вы сделаете следующее:
li = null;
Вместо вызова метода unload экземпляр останется в куче, и ваш счетчик количества экземпляров не будет уменьшен до тех пор, пока не произойдет GC.