Hãy lấy ví dụ đơn giản nhất: bạn có một ứng dụng và bạn chỉ sử dụng trình tải lớp mặc định. Bạn có một lớp, vì bất kỳ lý do gì, bạn quyết định rằng nó không nên có nhiều hơn một thể hiện trong ứng dụng. (Hãy nghĩ về một kịch bản trong đó một số người làm việc trên các phần của ứng dụng).
Nếu bạn không sử dụng Spring framework, mẫu Singleton đảm bảo rằng sẽ không có nhiều hơn một phiên bản của một lớp trong ứng dụng của bạn. Đó là bởi vì bạn không thể khởi tạo các thể hiện của lớp bằng cách làm 'mới' vì hàm tạo là riêng tư. Cách duy nhất để lấy một thể hiện của lớp là gọi một số phương thức tĩnh của lớp (thường được gọi là 'getInstance') luôn trả về cùng một thể hiện.
Nói rằng bạn đang sử dụng Spring framework trong ứng dụng của mình, chỉ có nghĩa là ngoài các cách thông thường để lấy một thể hiện của lớp (các phương thức mới hoặc tĩnh trả về một thể hiện của lớp), bạn cũng có thể yêu cầu Spring giúp bạn. một thể hiện của lớp đó và Spring sẽ đảm bảo rằng bất cứ khi nào bạn hỏi nó về một thể hiện của lớp đó, nó sẽ luôn trả về cùng một thể hiện, ngay cả khi bạn không viết lớp bằng cách sử dụng mẫu Singleton. Nói cách khác, ngay cả khi lớp có một hàm tạo công khai, nếu bạn luôn hỏi Spring về một thể hiện của lớp đó, thì Spring sẽ chỉ gọi hàm tạo đó một lần trong suốt vòng đời ứng dụng của bạn.
Thông thường nếu bạn đang sử dụng Spring, bạn chỉ nên sử dụng Spring để tạo các thể hiện và bạn có thể có một hàm tạo công khai cho lớp. Nhưng nếu phương thức khởi tạo của bạn không phải là private, bạn sẽ không thực sự ngăn cản bất kỳ ai tạo các phiên bản mới của lớp trực tiếp, bằng cách bỏ qua Spring.
Nếu bạn thực sự muốn một thể hiện duy nhất của lớp, ngay cả khi bạn sử dụng Spring trong ứng dụng của mình và xác định lớp trong Spring là một lớp đơn, thì cách duy nhất để đảm bảo rằng lớp đó cũng được triển khai bằng cách sử dụng mẫu Singleton. Điều đó đảm bảo rằng sẽ có một phiên bản duy nhất, cho dù mọi người sử dụng Spring để lấy một phiên bản hay bỏ qua Spring.