Согласно этому определению Monostates , это примечание:
"Моностаты - это зло точно так же, как SingletonsAreEvil ."
Я не обязательно согласен. Основная предпосылка заключается в том, что синглтоны и моностаты являются глобальными переменными, а поскольку глобалы являются злом, то же самое должно быть и синглетонами и моностатами.
Проблема с этой линией рассуждений заключается в том, что она не учитывает, ПОЧЕМУ глобалы злые. Глобалы являются злом прежде всего потому, что они являются переменными, к которым можно получить доступ за пределами локальной области действия случайно , подобно тому, как нетипизированные языки часто позволяют создавать переменные, просто ссылаясь на них.
Одиночные и моностаты не могут вызывать однотипные проблемы, потому что практически невозможно «случайно» сослаться на глобальную статическую переменную, вызвать ее метод экземпляра, а затем использовать экземпляр.
Другими словами, глобалы - это зло, потому что они вызывают тонкие и плохо видимые проблемы. Синглтоны и моностаты не вызывают одинаковых проблем, поэтому я не считаю их злыми по тем же причинам, и именно поэтому большинство людей ошибаются в этом аргументе.
Теперь, могут ли синглтоны и моностаты вызывать другие виды проблем? Конечно. Очевидно, что люди из TDD ненавидят их, потому что их сложно правильно протестировать с помощью автоматического тестирования. Хорошо, хорошо, но для тех людей, которые не используют TDD, таких проблем не существует.
Конечно, синглтонами можно злоупотреблять. Люди, которые используют их просто, чтобы избежать передачи экземпляра, злоупотребляют ими. Я думаю, что Monostates лучше для этого, чем синглтон.
Многие люди предлагают фабричные шаблоны вместо одиночных, но я чувствую, что фабрики - это просто модные генераторы-одиночки. Нет, статического метода «экземпляра» не существует, но он в основном делает то же самое (когда фабрика создает один объект экземпляра). Factory.Create ничем не отличается от Singleton.Instance.
EDIT:
Один аспект синглетонов и моностатов, сравнимый с глобальными, заключается в том, что они являются общими, и, следовательно, не безопасными для потоков. Хотя это важно, если вы планируете создавать многопоточные приложения, если вы знаете это, вы можете предпринять шаги для сериализации доступа к общим объектам. Так что это, вероятно, единственная область, где, как правило, все три типа могут рассматриваться как вызывающие проблемы.