Weźmy najprostszy przykład: masz aplikację i po prostu używasz domyślnego modułu ładującego klasy. Masz klasę, która z jakiegokolwiek powodu decydujesz, że nie powinna mieć więcej niż jednej instancji w aplikacji. (Pomyśl o scenariuszu, w którym kilka osób pracuje nad fragmentami aplikacji).
Jeśli nie korzystasz ze środowiska Spring, wzorzec Singleton zapewnia, że w Twojej aplikacji nie będzie więcej niż jedno wystąpienie klasy. Dzieje się tak, ponieważ nie można utworzyć instancji klasy, wykonując polecenie „new”, ponieważ konstruktor jest prywatny. Jedynym sposobem uzyskania instancji klasy jest wywołanie jakiejś statycznej metody klasy (zwykle nazywanej „getInstance”), która zawsze zwraca tę samą instancję.
Powiedzenie, że używasz frameworka Spring w swojej aplikacji, oznacza po prostu, że oprócz zwykłych sposobów uzyskiwania instancji klasy (nowych lub statycznych metod, które zwracają instancję klasy), możesz również poprosić Springa o uzyskanie instancja tej klasy i Spring zapewni, że za każdym razem, gdy poprosisz ją o instancję tej klasy, zawsze zwróci tę samą instancję, nawet jeśli klasa nie została napisana przy użyciu wzorca Singleton. Innymi słowy, nawet jeśli klasa ma konstruktora publicznego, jeśli zawsze prosisz Springa o instancję tej klasy, Spring wywoła ten konstruktor tylko raz w czasie życia aplikacji.
Zwykle, jeśli używasz Springa, powinieneś używać Springa tylko do tworzenia instancji i możesz mieć publiczny konstruktor dla klasy. Ale jeśli twój konstruktor nie jest prywatny, tak naprawdę nie uniemożliwiasz nikomu bezpośredniego tworzenia nowych instancji klasy, omijając Spring.
Jeśli naprawdę chcesz mieć jedną instancję klasy, nawet jeśli używasz Springa w swojej aplikacji i zdefiniujesz klasę w Spring jako singleton, jedynym sposobem na to jest zaimplementowanie klasy przy użyciu wzorca Singleton. Gwarantuje to, że będzie jedna instancja, niezależnie od tego, czy ludzie używają Springa do uzyskania instancji, czy też pomijają Spring.