Візьмемо найпростіший приклад: у вас є програма, і ви просто використовуєте завантажувач класів за замовчуванням. У вас є клас, який з будь-якої причини вирішує, що він не повинен мати більше одного екземпляра в програмі. (Подумайте про сценарій, коли декілька людей працюють над частинами програми).
Якщо ви не використовуєте фреймворк Spring, шаблон Singleton гарантує, що у вашій програмі не буде більше одного екземпляра класу. Це тому, що ви не можете створити екземпляри екземплярів класу, роблячи 'new', оскільки конструктор є приватним. Єдиний спосіб отримати екземпляр класу - це викликати якийсь статичний метод класу (зазвичай його називають 'getInstance'), який завжди повертає той самий екземпляр.
Сказати, що ви використовуєте фреймворк Spring у своєму додатку, просто означає, що на додаток до звичайних способів отримання екземпляра класу (нових або статичних методів, які повертають екземпляр класу), ви також можете попросити Spring отримати вас екземпляр цього класу та Spring забезпечують, що всякий раз, коли ви запитуєте його про екземпляр цього класу, він завжди повертає той самий екземпляр, навіть якщо ви не писали клас за шаблоном Singleton. Іншими словами, навіть якщо клас має відкритий конструктор, якщо ви завжди запитуєте у Spring екземпляр цього класу, Spring буде викликати цей конструктор лише один раз протягом життя вашої програми.
Зазвичай, якщо ви використовуєте Spring, ви повинні використовувати Spring лише для створення екземплярів, і ви можете мати загальнодоступний конструктор для класу. Але якщо ваш конструктор не є приватним, ви насправді нікому не заважаєте створювати нові екземпляри класу безпосередньо, минаючи Spring.
Якщо ви дійсно хочете одиничний екземпляр класу, навіть якщо ви використовуєте Spring у своєму додатку і визначаєте клас у Spring як синглтон, єдиний спосіб забезпечити це також реалізацію класу за допомогою шаблону Singleton. Це гарантує наявність одного екземпляра, незалежно від того, чи використовують люди Spring, щоб отримати екземпляр, або обходять Spring.