Это законное использование синглтона? - PullRequest
0 голосов
/ 22 января 2009

( Отказ от ответственности: Этот вопрос не относится к 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;
}

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

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

Ответы [ 3 ]

2 голосов
/ 22 января 2009

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

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

1 голос
/ 22 января 2009

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

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

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

0 голосов
/ 22 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...