Это законное использование синглтона?

(Заявление об ограничении ответственности: Этот вопрос относится к нет, специфичному для 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;
}

Синглтоны связаны с глобальными переменными; в этом случае нет состояния.

Синглтоны также связаны с жестко запрограммированными зависимостями. В этом случае требуется знание конкретного типа.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
243
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы действительно хотите использовать один и тот же экземпляр для элемента управления шаблоном? Нам может понадобиться дополнительная информация о том, чего вы пытаетесь достичь. Сколько мест используется TemplatedControl в одном приложении?

Идея в том, что я инкапсулирую конкретную реализацию интерфейса. Объект не зависит от состояния, и во всех случаях используется одна и та же конкретная реализация. Является ли создание объекта каждый раз излишним, если от экземпляра к экземпляру ничего не отличается?

Bryan Watts 22.01.2009 00:48

Создание экземпляра объекта никогда не бывает излишним. Это действительно невероятно быстрая операция. Что может повредить производительности, так это то, что вы будете делать с объектом, а не оператор «новый».

Darin Dimitrov 22.01.2009 01:10
Ответ принят как подходящий

В этом случае я бы сказал, что нет. В предлагаемом вами шаблоне всегда будет только один шаблон FooTemplate, который будет использоваться несколькими элементами управления, страницами и потоками. Вы должны быть очень осторожны, чтобы шаблон не содержал никаких запросов или пользовательской информации, а также синхронизировать любые вызовы методов. Гораздо проще и немного менее производительно создавать его каждый раз.

Единственная причина, по которой я это делаю, заключается в том, что создание экземпляра элемента управления занимает много времени. В этом случае я бы пошел с заводским шаблоном, где любая инициализация выполняется один раз, но все данные каждый раз копируются в новый экземпляр.

В шаблоне нет состояния. Я задал этот вопрос специально, потому что от экземпляра к экземпляру ничего не будет отличаться; это всего лишь класс, потому что мне нужно реализовать интерфейс.

Bryan Watts 22.01.2009 00:49

Пока нет переменных-членов, я не вижу вреда. Вы также можете использовать статическую переменную-член на своей странице.

Robert Wagner 22.01.2009 01:02

Шаблон является частным для элемента управления, который его использует; тип шаблона предоставляет статическое свойство .Instance.

Bryan Watts 22.01.2009 01:07

Если вы хотите, чтобы шаблон был создан только один раз для элемента управления, вы можете вместо этого использовать отложенную инициализацию и добиться почти такого же эффекта.

private ITemplate defaultTemplate;
public override ITemplate CreateDefaultTemplate()
{
     if (defaultTemplate == null)
     {
         defaultTemplate = new FooTemplate();
     }
     return defaultTemplate;
}

Вам следует использовать реализацию Singleton только в том случае, если вы уверены, что вам нужен только один экземпляр любого конкретного объекта в вашем приложении.

Смотрите мои комментарии к другим ответам. Я почти уверен, что в этом случае желателен один экземпляр.

Bryan Watts 22.01.2009 00:50

Одноэлементные объекты сложно тестировать. Я бы все равно избегал их, если только в этом не было крайней необходимости.

tvanfosson 22.01.2009 01:10

Поскольку у него нет параметров конструктора или состояния, его легко протестировать. Моя цель - определить, идентифицировал ли я законное использование синглтонов, полностью осознавая их недостатки (ни один из которых, похоже, здесь не применим).

Bryan Watts 22.01.2009 01:42

Другие вопросы по теме