Java - Duda usando singleton

   
Vista:

Duda usando singleton

Publicado por Oscar (3 intervenciones) el 19/02/2008 16:44:13
Hola, estoy resolviendo los ejercicios de Piensa en Java de Bruce Eckel y el problema dice asi..

Crear una clase denominada GestorConexion que gestione un Array Fijo de Objetos Conexion. El programador cliente no debe de ser capaz de crear explicitamente objetos Conexion, sino que solamente puede crear objetos a través de un método estatico de GestorConexion. Cuando el GestorConexion se quede sin objetos devolvera una referencia null. Probar las clases en main.. tip.. usar el patrón Singleton

package c05.patrones;

class Conexion {
//Hacemos privado el constructor para poder instanciar con un método singleton
private Conexion(){
System.out.println("Me has creado");
}
static Conexion getInstance(){
return new Conexion();
}
}

public class GestorConexion {
static int instancias=5;
static Conexion[] ConexionesDisponibles = new Conexion[5];
static Conexion getInstance(){
if(instancias<1){
return null;
}else{
instancias--;
return ConexionesDisponibles[instancias].getInstance();
}
}
public static void main(String[] args) {
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
GestorConexion.getInstance();
}

}
Esto me da esta salida...

Me has creado
Me has creado
Me has creado
Me has creado
Me has creado

Osea quiere decir que solo segun yo se crearon solo 5 objetos conexion dado que aunque invoco muchos más solo he permitido la creacion de 5.. no se Pero presiento que no esta bien :s por que dice que hay que crear un metodo en GestorConexion.. para crear los objetos conexion.. pero si el constructor de Conexion es privado como puedo hacer referencia a el :s ,

alguna idea?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda usando singleton

Publicado por mario (622 intervenciones) el 20/02/2008 00:04:23
Q tal:

al parecer funciona tu programa pero no esta bien realizado deacuerdo a l ejercicio el singleton debe estar en la clase GestionarConexion y no en conexion asi yo lo haria:

package org.neos.samples;

/**
* @author Mario Hidalgo Martinez
*
*/
public class Conexion {

public Conexion() {

}

}


package org.neos.samples;

/**
* @author Mario Hidalgo
*
*/
public class GestionarConexion {

private Conexion conn[];

private static GestionarConexion instance;
private int cont=0;


static {
instance = new GestionarConexion();
}

private GestionarConexion() {
conn= new Conexion[5];
for (int i=0;i<5;i++) {
conn[i]= new Conexion();
}
}


public static GestionarConexion getInstance() {
return instance;
}

public Conexion getConexion() {
Conexion condummy=null;
if (cont<5) {

condummy=conn[cont];
cont++;
}
return condummy;
}

public static void main(String args[]) {
GestionarConexion gest= GestionarConexion.getInstance();
Conexion conn= gest.getConexion();
System.out.println(conn);

conn= gest.getConexion();
System.out.println(conn);

conn= gest.getConexion();
System.out.println(conn);

conn= gest.getConexion();
System.out.println(conn);

conn= gest.getConexion();
System.out.println(conn);

conn= gest.getConexion();
System.out.println(conn);

}

}

Saludos comunidad opensource

felicidades sigue estudiando patrones de diseño!!!!! t serviran mucho en la vida real ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda usando singleton

Publicado por chuidiang (949 intervenciones) el 20/02/2008 07:00:19
Hola:

El constructor debe ser privado precisamente para asegurar que nadie puede llamarlo. Nadie, exepto la misma clase, por lo que ella es la única que puede crear instancias.

Al pedirte el enunciado un GestorConexion distinto de Conexion, no puedes poner el constructor private, ya que si no, GestorConexion no puede hacer los new de Conexion.

Un patrón singleton puro no usa dos clases, sino sólo una, de forma ella misma tiene el constructor privado y el método estático para obtener instancias. En tu caso, no puedes usar un Singleton puro, ya que te piden dos clases, Conexion y GestorConexion.

Tu código no he mirado si funciona, pero salvo el detalle que te he comentado, parece correcto.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda usando singleton

Publicado por Oscar (3 intervenciones) el 20/02/2008 17:22:24
Estoy de acuerdo en que el singleton solo usa una clase, me hablaron de que podría usar un patron de creación llamado Factory.. ¿como ven eso?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda usando singleton

Publicado por Oscar (3 intervenciones) el 20/02/2008 17:18:54
Hola, que tal muchisimas gracias por tu respuesta me a hecho ver otro panorama, sin embargo tengo una duda.. el ejercicio decia que no se pudieran crear instancias de Conexion directamente.. y como el constructor de Conexion no es privado si puedo hacer objetos Conexion Explicitamente.. Ahora.. otra duda.. ¿que es lo que imprime?

por ejemplo

Conexion@fde3dd

¿Es como el identificador de la referencia a la clase o que es?

Otra cosa por que usaste un bloque estatico para definir esta variable ?

static {
instance = new GestionarConexion();
}

Muchas gracias..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda usando singleton

Publicado por Tom (914 intervenciones) el 20/02/2008 11:34:35
Yo haría algo así:

package patrones;

/* */
public final class GestorConexion {
private static Conexion[] conexiones;

/* */
public static Conexion getConexion() {
/* Crear y retornar objeto Conexion */
}
/* */
public static class Conexion {
/* */
private Conexion() {
/* inicializar */
}
/* */
public void hacerAlgo() {
/* eso mismo */
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda usando singleton

Publicado por Hector (27 intervenciones) el 27/02/2008 11:20:20
En mi opinion esta todo bien excepto el metodo getInstance
Yo lo haria asi:

static Conexion getInstance(){
if(conexion==null)
return new Conexion();
else
return conexion;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar