
Este patrón nos ayuda a no repetir un mismo proceso en diferentes instancias de otras clases.
Consiste en garantizar un punto de acceso global de el resto de clases de nuestra aplicación como puede ser la coenxión a la base de datos. No se encarga de la creación de objetos en sí, sino que se enfoca en la restricción en la creación de un objeto.
El uso del patrón Singleton proporciona los siguientes beneficios:
- Reduce el espacio de nombres. El patrón es una mejora sobre las variables globales. Ya no se reservan nombres para las variables globales, ahora solo existen instancias
- Controla el acceso a la instancia única, porque la clase Singleton encapsula la única instancia. Así se obtiene control sobre cómo y cuándo se accede a ella.
- Permite el refinamiento de las operaciones y la representación.
- Permite un numero variable de instancias. El patron es facilmente configurable para permitir más de una instancia
- Más flexible que las operaciones de clases
Veamos un ejemplo con la conexión a una base de datos:
En el ejemplo de punto anterior vimos como en una clase resultaba útil implementar un método para conectarse y desconectarse el cual llamábamos desde los diferentes métodos de manipulación de los datos.
Esto nos resuelve el problema de tener que codificar multiples veces el código de acceso a la BD en la clase. Pero, ¿Qué ocurre sí tenemos que conectarnos desde diferentes clases?
Para resolverlo haremos una clase utilizando este patrón el cual lo que realiza es una instalación de sí misma donde mediante un método getConexion estático para llamarlo directamente almacena la conexión en un atributo estático de la misma clase. (Este atributo es estático para permitir su visibilidad desde la llamada del método).
CLASE DE CONEXIÓN:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package dao; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Connection; import java.util.Properties; //Esta clase se va a dedicar única y exclusivamente ha generar la conexion con la BASE DE DATOS public class DBconnection { // Los atributos los hacemos static, para que puedan ser accesibles. private static final String JDBC_URL = "jdbc:mysql://localhost:3306/libreriasmadrid"; //Creamos un objeto de la clase conexion instanciado a null porque cuando lo creamos aun no tiene nada. //Lo necesitamos vacio // Los atributos los hacemos static, para que puedan ser accesibles. private static Connection instance = null; private DBconnection() { } //getConnection la hemos hecho estatica para usarla desde otros lados y aprovecharla. public static Connection getConnection() throws SQLException { if (instance == null) { Properties props = new Properties(); //Esto es un objeto de Java, es un mapa que el JDBC es capaz de usar props.put("user","root"); //Este objeto mediante las claves user y password props.put("password",""); instance = DriverManager.getConnection(JDBC_URL, props); //Este objeto va a cargar mediante el driverManaager mandandole como parametro la direccion del servidor (que esta creada arriba) y //el props que es el usuario y la contraseña } return instance; } } |
De esta manera, ahora podemos realizar el proceso de conectarnos a la base de datos desde cualquier método de nuestra aplicación.
CLASE DAO:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ublic class DAOusuarios { //Esta clase esta en plural porque no es solo para crear un Usuario, tambien por ej para sacar todos los usuarios registrados y mas cosas. private Connection con = null; //Sin inicializar por eso lo igualamos a null public static DAOusuarios instance = null; public DAOusuarios() throws SQLException { //Creamos el constructor con = DBconnection.getConnection(); /* Al inicializar el constructor ejecutamos el metodo .getConnection que se conecta a la base de datos y nos retorna esa direccion ( return instance) */ } public static DAOusuarios getInstance() throws SQLException { //Metedo que genera un objeto de la propia clase en la que se encuentra, sencillo. if(instance == null) { instance = new DAOusuarios(); } return instance; } |
Por lo que en los métodos del crud cuando realicemos el preparestatement, lo aremos desde el atributo (objeto dbconection) de la misma clase.
|
1 |
PreparedStatement ps = con.prepareStatement("INSERT INTO usuario |