(Заявление об ограничении ответственности: Этот вопрос относится к нет, специфичному для ASP.NET)
У меня есть элемент управления, который может быть шаблонным, аналогично элементам управления входом:
public abstract class TemplatedControl : CompositeControl
{
public ITemplate Template { get; set; }
protected override void CreateChildControls()
{
var template = this.Template ?? CreateDefaultTemplate();
// ...
}
protected virtual ITemplate CreateDefaultTemplate()
{
return null;
}
}
Шаблонный элемент управления будет выглядеть так:
public class FooControl : TemplatedControl
{
public override ITemplate CreateDefaultTemplate()
{
return new FooTemplate();
}
}
Мой вопрос: подойдет ли здесь синглтон?
public override ITemplate CreateDefaultTemplate()
{
return FooTemplate.Instance;
}
Синглтоны связаны с глобальными переменными; в этом случае нет состояния.
Синглтоны также связаны с жестко запрограммированными зависимостями. В этом случае требуется знание конкретного типа.





Вы действительно хотите использовать один и тот же экземпляр для элемента управления шаблоном? Нам может понадобиться дополнительная информация о том, чего вы пытаетесь достичь. Сколько мест используется TemplatedControl в одном приложении?
Создание экземпляра объекта никогда не бывает излишним. Это действительно невероятно быстрая операция. Что может повредить производительности, так это то, что вы будете делать с объектом, а не оператор «новый».
В этом случае я бы сказал, что нет. В предлагаемом вами шаблоне всегда будет только один шаблон FooTemplate, который будет использоваться несколькими элементами управления, страницами и потоками. Вы должны быть очень осторожны, чтобы шаблон не содержал никаких запросов или пользовательской информации, а также синхронизировать любые вызовы методов. Гораздо проще и немного менее производительно создавать его каждый раз.
Единственная причина, по которой я это делаю, заключается в том, что создание экземпляра элемента управления занимает много времени. В этом случае я бы пошел с заводским шаблоном, где любая инициализация выполняется один раз, но все данные каждый раз копируются в новый экземпляр.
В шаблоне нет состояния. Я задал этот вопрос специально, потому что от экземпляра к экземпляру ничего не будет отличаться; это всего лишь класс, потому что мне нужно реализовать интерфейс.
Пока нет переменных-членов, я не вижу вреда. Вы также можете использовать статическую переменную-член на своей странице.
Шаблон является частным для элемента управления, который его использует; тип шаблона предоставляет статическое свойство .Instance.
Если вы хотите, чтобы шаблон был создан только один раз для элемента управления, вы можете вместо этого использовать отложенную инициализацию и добиться почти такого же эффекта.
private ITemplate defaultTemplate;
public override ITemplate CreateDefaultTemplate()
{
if (defaultTemplate == null)
{
defaultTemplate = new FooTemplate();
}
return defaultTemplate;
}
Вам следует использовать реализацию Singleton только в том случае, если вы уверены, что вам нужен только один экземпляр любого конкретного объекта в вашем приложении.
Смотрите мои комментарии к другим ответам. Я почти уверен, что в этом случае желателен один экземпляр.
Одноэлементные объекты сложно тестировать. Я бы все равно избегал их, если только в этом не было крайней необходимости.
Поскольку у него нет параметров конструктора или состояния, его легко протестировать. Моя цель - определить, идентифицировал ли я законное использование синглтонов, полностью осознавая их недостатки (ни один из которых, похоже, здесь не применим).
Идея в том, что я инкапсулирую конкретную реализацию интерфейса. Объект не зависит от состояния, и во всех случаях используется одна и та же конкретная реализация. Является ли создание объекта каждый раз излишним, если от экземпляра к экземпляру ничего не отличается?