El patrón Singleton garantiza que una clase sólo tenga una instancia, y proporciona un punto de acceso global a la misma.
La necesidad de controlar el acceso y la creación de una instancia de una clase. Es útil cuando una sola instancia de una clase debe ser compartida y coordinada a través de todo el sistema.
La solución que propone el Singleton es limitar la creación de una clase a un solo objeto y brindar un punto de acceso global a este objeto:

Los detalles a notar son:
Aplicando constructor privado y atributo estático de la propia clase con método estático que la retorne, podemos convertir una clase en Singleton.
Este patrón es recomendable cuando:
Control de Instancias: Asegura que solo exista una instancia de una clase.
Reducción de Uso de Recursos: Evita la creación innecesaria de objetos, lo que puede ahorrar recursos.
Acceso Global: Ofrece un punto de acceso a la instancia desde cualquier parte del código.
Desventajas
Incumplimiento del principio de Responsabilidad Única: Puede llevar a una clase a tener múltiples responsabilidades, ya que agrega la responsabilidad de garantizar su única instancia.
Problemas en entornos multihilos: Se debe sincronizar el acceso a la única instancia en entornos concurrentes.
Debemos desarrollar una clase para mantener los parámetros de configuración durante la ejecución del sistema, que deben ser accesibles globalmente y consistentes.
Los clientes deben poder acceder a los parámetros de configuración en todo momento, por lo que podríamos mantenerlos en un objeto, cargados al iniciar (para no tener que cargarlos más de una vez). Tener una sola instancia de este objeto podría ser una buena solución.
Solución planteada
Implementamos un Singleton, porque nos va a garantizar una sola instancia del objeto que mantiene los parámetros de configuración, y nos brinda el acceso a la misma.
Creamos la clase Configuration que contiene los parámetros de configuración, y la convertimos en singleton, mediante un constructor privado, un atributo estático instance de la misma clase Configuration y un método estático de acceso a esta instancia getInstance().
Application es una de las clases que necesita acceder a los valores de los parámetros de configuración.

Codificamos en Java lo que preparamos en el diagrama.
Definimos la clase singleton de la forma:
public class Configuration {
//Atributo estático del tipo de la clase
private static Configuration instance;
//Atributos propios de la clase
private String configValue;
private Configuration() {
// Constructor privado
configValue = “Initial Config”;
}
//Método estático de acceso a la única instancia
public static Configuration getInstance() {
if (instance == null) {
instance = new Configuration();
}
return instance;
}
//Métodos propios de la clase
public String getConfigValue() {
return configValue;
}
public void setConfigValue(String configValue) {
this.configValue = configValue;
}
}
El código cliente, usa los prototipos para crear formas:
public class Application {
public static void main(String[] args) {
Configuration config = Configuration.getInstance();
System.out.println(config.getConfigValue());
config.setConfigValue(“Updated Config”);
Configuration anotherConfig = Configuration.getInstance();
System.out.println(anotherConfig.getConfigValue()); // Mostrará “Updated Config”
}
}
Los participantes que vimos antes son: Singleton, Application:
Necesitábamos almacenar parámetros, vimos cómo hacerlo con un singleton, que nos garantiza un único objeto que los mantiene durante toda la ejecución y otorga el acceso al mismo.
A veces se implementan como Singleton.
Puede implementarse como Singleton.