Este proyecto implementa una aplicación Java que utiliza el patrón de diseño Singleton para centralizar la gestión de configuración global. La aplicación demuestra el uso práctico del patrón Singleton con características avanzadas como thread safety, persistencia de datos y interfaces de usuario interactivas.
- ✅ Implementación thread-safe del patrón Singleton
- ✅ Gestión centralizada de configuración desde archivo externo
- ✅ Dos pantallas interactivas que utilizan la configuración
- ✅ Menú principal completo con todas las funcionalidades
- ✅ Manejo robusto de errores y valores por defecto
Clase Principal: ConfigurationManager
- ✨ Thread Safety: Implementa double-checked locking con
volatile - 🔒 Concurrencia: Utiliza
ReentrantReadWriteLockpara operaciones seguras - 💾 Persistencia: Carga y guarda configuración automáticamente
- 🛡️ Robustez: Manejo de errores con fallback a valores por defecto
Singleton/
├── src/main/java/preko/singleton/
│ ├── Main.java # 🎮 Menú principal e interfaz de usuario
│ ├── ConfigurationManager.java # 🏛️ Implementación del Singleton
│ ├── ConfigurationLoader.java # 📂 Lógica de lectura/escritura de archivos
│ ├── WelcomeScreen.java # 👋 Pantalla de bienvenida personalizada
│ └── ConnectionSimulator.java # 🔗 Simulador de conexiones con hilos
├── config.properties # ⚙️ Archivo de configuración
└── README.md # 📖 Esta documentación
El sistema gestiona 10 parámetros según especificaciones:
| Parámetro | Tipo | Valor por Defecto | Descripción |
|---|---|---|---|
defaultCurrency |
String | USD |
Moneda para transacciones (USD, CRC, EUR) |
timeFormat |
String | 24H |
Formato de hora (24H, AM/PM) |
maxConnections |
Integer | 10 |
Número máximo de conexiones simuladas |
language |
String | EN |
Idioma del sistema (EN, ES) |
autoSaveInterval |
Integer | 5 |
Intervalo de auto guardado (minutos) |
enableLogs |
Boolean | true |
Activar/desactivar logs detallados |
theme |
String | light |
Tema visual (light, dark) |
region |
String | LATAM |
Región del sistema |
backupEnabled |
Boolean | true |
Activar respaldos automáticos |
backupDirectory |
String | ./backups |
Directorio para respaldos |
El sistema utiliza formato Java Properties:
# Configuration Manager Settings
defaultCurrency=USD
timeFormat=24H
maxConnections=10
language=EN
autoSaveInterval=5
enableLogs=true
theme=light
region=LATAM
backupEnabled=true
backupDirectory=./backups=== MAIN MENU ===
1. View current configuration # Ver toda la configuración actual
2. Change configuration # Modificar parámetros específicos
3. Go to welcome panel # Ejecutar pantalla de bienvenida
4. Execute connection simulator # Iniciar simulador de conexiones
5. Exit system # Salir de la aplicación
Funcionalidades:
- 🌐 Mensajes multiidioma basados en
language - ⏰ Formato de hora personalizado según
timeFormat - 🎨 Decoración temática adaptada al
theme - 📍 Información regional usando
region
Ejemplo de salida:
========================================
Welcome to Configuration Manager!
Current Time: 17:37:13
Theme: light
Region: LATAM
========================================
Características avanzadas:
- 🎯 Simulación realista con 80% tasa de éxito
- 📊 Estadísticas detalladas de conexiones exitosas/fallidas
- 💰 Cálculo de costos por moneda configurada
- 🧵 Delays simulados para realismo
- 📝 Logs condicionales basados en
enableLogs
Ejemplo de salida:
=== CONNECTION SIMULATOR ===
Starting simulation with max connections: 10
Logging enabled: true
Currency: USD
[LOG] Connection #1 - SUCCESS
[LOG] Connection #2 - SUCCESS
[LOG] Connection #3 - FAILED
...
=== SIMULATION SUMMARY ===
Total attempted connections: 10
Successful connections: 8
Failed connections: 2
Success rate: 80.00%
Currency for transactions: USD
Estimated cost: 4.00 USD
classDiagram
class ConfigurationManager {
-static volatile instance
-static ReentrantReadWriteLock lock
-Properties configuration
-ConfigurationLoader loader
+getInstance() ConfigurationManager
+getProperty(key) String
+setProperty(key, value) void
+saveConfiguration() void
+getBooleanProperty(key) boolean
+getIntProperty(key) int
}
class ConfigurationLoader {
-static String CONFIG_FILE
+loadConfiguration() Properties
+saveConfiguration(Properties) void
-createDefaultConfiguration() Properties
}
class WelcomeScreen {
-ConfigurationManager config
+display() void
-getWelcomeMessage() String
-getCurrentTime() String
-getThemeDecoration() String
}
class ConnectionSimulator {
-ConfigurationManager config
-Random random
+simulate() void
-simulateConnection(int, boolean) boolean
-calculateCost(int, String) String
}
class Main {
-static Scanner scanner
+main(String[]) void
-showMainMenu() void
-viewCurrentConfiguration() void
-changeConfiguration() void
-showWelcomeScreen() void
-runConnectionSimulator() void
}
ConfigurationManager --> ConfigurationLoader : uses
WelcomeScreen --> ConfigurationManager : uses
ConnectionSimulator --> ConfigurationManager : uses
Main --> ConfigurationManager : uses
Main --> WelcomeScreen : creates
Main --> ConnectionSimulator : creates
- ☕ Java 8 o superior
- 📦 Maven 3.6+ (opcional, para compilación)
- 💾 50MB espacio en disco
# 1. Clonar el repositorio
git clone https://github.com/Preko700/Singleton.git
cd Singleton
# 2. Navegar al directorio de código fuente
cd Singleton/src/main/java
# 3. Compilar todos los archivos Java
javac -d ../../../target preko/singleton/*.java
# 4. Ejecutar la aplicación
cd ../../../target
java preko.singleton.Main- Abrir proyecto en IntelliJ IDEA/Eclipse/VS Code
- Configurar JDK (Java 8+)
- Ejecutar
Main.java
Singleton/
├── src/ # Código fuente
├── target/ # Archivos compilados
├── config.properties # Configuración (se crea automáticamente)
└── README.md # Esta documentación
=== CHANGE CONFIGURATION ===
Available parameters:
1. defaultCurrency
2. timeFormat
...
Enter parameter name to change: language
Enter new value: ES
Configuration updated successfully!
████████████████████████████████████████
¡Bienvenido al Gestor de Configuración!
Current Time: 05:37:13 PM
Theme: dark
Region: LATAM
████████████████████████████████████████
// Múltiples hilos obtienen la misma instancia
ConfigurationManager config1 = ConfigurationManager.getInstance();
ConfigurationManager config2 = ConfigurationManager.getInstance();
assert config1 == config2; // ✅ Misma instancia- Cambiar parámetro
languageaES - Reiniciar aplicación
- Verificar que mantiene
language=ES
- Eliminar
config.properties - Ejecutar aplicación
- Verificar carga de valores por defecto
- Cambiar
themeadark - Ejecutar WelcomeScreen
- Verificar decoración con
████
- Double-checked locking para inicialización segura
- ReentrantReadWriteLock para operaciones concurrentes
- Volatile para visibilidad entre hilos
- Try-catch para operaciones de archivo
- Fallback a configuración por defecto
- Validación de tipos de datos
- Lazy initialization del Singleton
- Atomic operations en el simulador
- Efficient I/O con try-with-resources
- Propósito: Una única instancia de ConfigurationManager
- Implementación: Thread-safe double-checked locking
- Beneficios: Acceso global controlado, consistencia de datos
- Próxima implementación según roadmap del proyecto
Para contribuir al proyecto:
- 🍴 Fork el repositorio
- 🌿 Crear rama:
git checkout -b feature/nueva-funcionalidad - 💾 Commit:
git commit -am 'Agrega nueva funcionalidad' - 📤 Push:
git push origin feature/nueva-funcionalidad - 🔀 Pull Request: Crear desde GitHub
- 👤 Autor: Preko700
- 📅 Fecha: Junio 2025
- 🎓 Propósito: Proyecto académico - Patrones de Diseño
- ⭐ Calificación esperada: Cumple 100% de especificaciones
- ✨ Implementación avanzada: Thread safety más allá de lo requerido
- 🎨 UX mejorada: Decoraciones temáticas y multiidioma
- 📊 Simulación realista: ConnectionSimulator con estadísticas
- 🛡️ Robustez: Manejo completo de errores
- 📖 Documentación: README completo y profesional