В последнее время произошла какая-то революция против синглетонов, но что с ними не так, если они не имеют гражданства?
Я знаю разговоры о чрезмерном использовании и все ... это относится ко всему, а не только к одиночкам.
В последнее время произошла какая-то революция против синглетонов, но что с ними не так, если они не имеют гражданства?
Я знаю разговоры о чрезмерном использовании и все ... это относится ко всему, а не только к одиночкам.
Ответы:
> Are immutable/stateless singletons bad?
Для получения более подробной информации см. Архитектура лука
Я не вижу других причин, почему бы не использовать Singletons.
Это всегда зависит от использования. Я думаю , что революция исходит из того, что каждый программист узнает эту модель как в объектно - ориентированном узор. Большинство забывает думать о том, где это имеет смысл, а где нет.
Это, конечно, верно для каждого шаблона. Просто используя шаблоны, вы не создаете хороший код или хорошее программное обеспечение.
Если у вас есть одноэлементный файл без сохранения состояния, почему бы не использовать класс, предлагающий только статические методы (или использовать статический класс)?
Вот несколько постов, касающихся глобальных переменных и синглетонов в целом.
Я не был бы таким строгим, как автор, но он показывает, что в большинстве случаев, когда вы думаете, что вам нужен синглтон, он вам на самом деле не нужен.
Нет ничего, что неизменный синглтон без состояния может сделать, чего не может статический класс.
Нет просто никакой причины добавлять дополнительный уровень сложности, который создает -> Instance (), в то время как простой вызов статического метода будет более понятным, более консервативным с точки зрения ресурсов и, возможно, быстрее.
Дело не в том, что они не правы. Дело в том, что есть лучший способ сделать это. Есть сценарии, в которых нормальные (с «состоянием») синглтоны - правильный путь. Недостаток синглтона в том, что им часто злоупотребляют, что приводит к таким же плохим результатам, что и глобальные переменные, но есть конкретные случаи, когда использование синглтона просто правильно. Таких случаев для лиц без гражданства нет.
Основная проблема с синглтоном заключается в том, что он скрывает зависимости и связи, особенно при использовании в сценарии сквозных задач. См. « Синглетоны - патологические лжецы» или « Почему синглеты - зло» для дальнейшего чтения.
С другой стороны, состояние без единого знака, если не злоупотреблять, может быть полезным и улучшить производительность. Рассмотрим пример:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
Здесь StatelessSingleton действует как реализация интерфейса по умолчанию и помещается в конструктор User. Нет жестко закодированных связей и скрытых зависимостей. Мы не можем использовать статический класс из-за базового интерфейса, но нет причин создавать более одного экземпляра по умолчанию. Вот почему синглтон без гражданства кажется подходящим выбором.
Однако, возможно, нам следует использовать другой шаблон для реализации по умолчанию:
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
Это поражает производительность по отношению к StatelessSingleton, но представляет собой общую реализацию интерфейса. Аналогичное решение используется интерфейсом IProgress .
И опять же, зачем разрешать создавать более одной реализации поведения по умолчанию? Тем не менее мы можем объединить два:
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
В заключение я считаю, что есть места (как показано по умолчанию), где синглтоны полезны. Основное определение Singleton гласит, что запрещено создавать более одного экземпляра класса. Это как ядерная энергия. Может производить энергию или бомбу. Это зависит от человека.