Здесь нужно понимать, что существуют разные группы памяти для c # / java.
Все ваши классы будут загружены в раздел памяти, называемый памятью загрузчика классов. Если вы делаете что-то статичное, оно остается в памяти загрузчика классов. Он может быть использован оттуда, но может иметь только 1 экземпляр. Для памяти загрузчика классов не существует сборщика мусора, все остается там в течение жизни приложения.
Создание экземпляра класса, будь то одноэлементный или нет, означает, что копия памяти сделана, копирование вашего класса из памяти загрузчика классов и копирование его в область, где хранятся экземпляры. Экземпляры можно собирать мусором.
Фактическая точка решения между опцией singleton и статическим классом:
1) Хотите ли вы наследование или интерфейс для вашего класса (если вам нужен Singleton)
2) Имеет ли смысл принудительно заставлять ваш класс иметь жизненный цикл, который совпадает с вашими приложениями (т. Е. Вам придется вручную очищать класс или писать для этого метод, который неоправданно увеличивает код, а следовательно, снижает удобство сопровождения). (если этого не произойдет, то вам нужен синглтон)
3) Требует ли ваше приложение масштабируемости и возможности для изменений. В настоящее время синглтон часто считается анти-паттерном, если он реализован через статическое свойство. Причина этого заключается в том, что вы инвестируете в инфраструктуру, например, выставляете статическое свойство экземпляра для вашего класса, что может быть совсем не тем, что вы хотите в будущем, потому что ваше приложение с одним окном может внезапно стать многооконным, и вам нужно переписать код. (переписывание кода указывает на плохой дизайн, особенно если его основная инфраструктура).
Как правило, я бы рекомендовал следующее:
- Любой класс, в котором есть переменные класса, которые должны быть одноэлементными (из-за необходимости его масштабирования).
- Любой класс, где каждый метод стоит самостоятельно, должен быть статическим.