Такие разные одиночки

Данная запись является вольным переводом статьи Джона Скита «Implementing the Singleton Pattern in C#» (англ.), которая чрезвычайно понравилась мне как полнотой материала, так и манерой его подачи (с объяснением причин, особенностей и последствий).

Введение

Паттерн одиночка — один из наиболее известных паттернов проектирования. По сути, одиночка — класс, позволяющий создать лишь один свой экземпляр и обычно предоставляющий простой способ доступа к этому экземпляру. Чаще всего одиночки при создании экземпляра не позволяют указывать никаких параметров, так как в этом случае удовлетворение второго обращения с отличающимися параметрами было бы проблематично (в случае, если конкретный экземпляр должен быть доступен вызовам с одинаковыми параметрами, лучше использовать фабрику). Эта статья относится только к ситуации, когда параметры не нужны. Обычным требованием к одиночкам является ленивая инициализация, то есть создание экземпляра только тогда, когда в нём впервые возникает необходимость.
Реализовать одиночку в C# можно несколькими различными способами. Я опишу их здесь в порядке возрастания изящества, начиная с наиболее часто встречающегося потоконебезопасного способа и заканчивая самой ленивой, простой, потокобезопасной и производительной реализацией. Читать далее