martes, 26 de julio de 2011

1. Explique con ejemplos que son los patrones de diseño y su uso en el desarrollo de software.

Los patrones de diseño son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.

Un patrón de diseño es una solución a un problema de diseño. Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.

Los patrones de diseño son independientes del lenguaje que se utilice (siempre y cuando el lenguaje sea orientado a objetos)

Los patrones de diseño pretenden:

·         Proporcionar catálogos de elementos reusables en el diseño de sistemas software.
·         Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y solucionados anteriormente.
·         Formalizar un vocabulario común entre diseñadores.
·         Estandarizar el modo en que se realiza el diseño.
·         Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando conocimiento ya existente.

No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo problema o similar que soluciona el patrón, siempre teniendo en cuenta que en un caso particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un error".

Mostraremos dos Ejemplos con Patrones de Diseño

Patron Prototipo:

Este patrón sustituirá para el cliente la palabra clave new por otra forma de crear objetos. En este caso específico la creación se hará sobre objetos que son complicados de crear, que para evitar usar new  serán clonados a partir de una instancia ya existente.

Ejemplo

//******************************
//Implementamos la Clase Alumno
//******************************
package Alumnos;

/**
 *
 * @author fprado
 */
public class Alumno implements Cloneable {
    private String nombres;
    private String apellidos;
    private String direccion;
    private String telefono;
    private String nacionalidad;

    public Alumno(){
    }
   
    @Override
    //**********************
    //Implemntamos Prototipo
    //**********************
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }

    /**
     * @return the nombres
     */
    public String getNombres() {
        return nombres;
    }

    /**
     * @param nombres the nombres to set
     */
    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    /**
     * @return the apellidos
     */
    public String getApellidos() {
        return apellidos;
    }

    /**
     * @param apellidos the apellidos to set
     */
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }


    /**
     * @return the direccion
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * @param direccion the direccion to set
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * @return the telefono
     */
    public String getTelefono() {
        return telCasa;
    }

    /**
     * @param telefono the telefono to set
     */
    public void setTelefono(String telefono) {
        this.telCasa = telCasa;
    }

    /**
     * @return the nacionalidad
     */
    public String getNacionalidad() {
        return nacionalidad;
    }

    /**
     * @param nacionalidad the nacionalidad to set
     */
    public void setNacionalidad(String nacionalidad) {
        this.nacionalidad = nacionalidad;
    }
   
}

//*****************************
//Instanciamos la clase Alumno
//*****************************
Package test;
import alumnos.Alumno;

/**
 *
 * @author fprado
 */
public class Test{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Persona juan = new Alumno();

        juan.setNombres("Juan José");
        juan.setApellidos("Pérez Ramirez");
        juan.setDireccion("Villa Rosario, Zulia");
        juan.setTelefono("0414-9999999");
        juan.setNacionalidad("Venezolano");

        //Hacer algo con Juan, ingresarlo al sistema, etc...
        System.out.println("Ingresando al sistema :"+juan.toString());
        System.out.println(juan.getNombres());
        System.out.println(juan.getApellidos());


        //ingresar a Maria al sistema....
        Persona maria;
        //*******************
 //Usamos el prototipo
        //*******************
        maria = (Persona)juan.clone();

        maria.setNombres("María Inés");
        System.out.println("Ingresando al sistema :"+maria.toString());
        System.out.println(maria.getNombres());
        System.out.println(maria.getApellidos())
    }
}


Patron Adaptador

Se puede utilizar en muchos contextos y es de especial utilidad cuando se utilizan códigos o librerías ajenos al que estamos utilizando y sobre el que no tenemos control.

Ejemplo:

//***********************
//Nuestra Clase abstracta
//***********************
package adaptador;

/**
 *
 * @author fprado
 */
public abstract class Motor {
   abstract public void encender();
   abstract public void acelerar();
   abstract public void apagar();
   //...mas metodos que hacen muchas cosas
}


//************************************************
//Implementamos una nueva Clase derivada de Motor
//************************************************
package patrones;
import adaptador.Motor;

/**
 *
 * @author fprado
 */
public class MotorEconomico extends Motor {

    public MotorEconomico(){
        //Se instancia la clase Motor
        //***************************
        super();
        System.out.println("Craendo motor economico");
    }

    @Override
    public void encender() {
        System.out.println("Encendiendo motor economico.");
    }

    @Override
    public void acelerar() {
        System.out.println("Acelerando motor economico.");
    }

    @Override
    public void apagar() {
        System.out.println("Apagando motor economico.");
    }
}

//**************************************************
//Implementamos otra nueva Clase derivada para Motor
//**************************************************
package patrones;
import adaptador.Motor;

/**
 *
 * @author fprado
 */
public class MotorAltoConsumo extends Motor {
    public MotorAltoConsumo(){
        //Se instanacia la Clase Motor
        //****************************
        super();
        System.out.println("Creando el motor alto consumo");
    }

    @Override
    public void encender() {
        System.out.println("Bum,bum....encendiendo motor alto consumo");
    }

    @Override
    public void acelerar() {
        System.out.println("Buuum, acelerando y gastando muuuucha gasolina");
    }

    @Override
    public void apagar() {
        System.out.println("Apagando motor alto consumo");
    }
}

//*************************************************
//Implementacion de una clase foranea de un tercero
//*************************************************
package patrones;

/**
 * Implementacion de un Motor Electrico
 * @author fprado
 */
public class MotorElectrico {

    private boolean conectado = false;

    public MotorElectrico() {
        System.out.println("Creando motor electrico");
        this.conectado = false;
    }

    public void conectar() {
        System.out.println("Conectando motor eléctrico");
        this.conectado = true;
    }

    public void activar() {
        if (!this.conectado) {
            System.out.println("No se puede activar porque no esta conectado el motor electrico");
        } else {
            System.out.println("Esta conectado, activando motor electrico....");
        }
    }

    public void moverMasRapido() {
        if (!this.conectado) {
            System.out.println("No se puede mover rapido el motor electrico porque no esta conectado...");
        } else {
            System.out.println("Moviendo mas rapido...aumentando voltaje");
        }
    }

    public void detener() {
        if (!this.conectado) {
            System.out.println("No se puede detener motor electrico porque no esta conectado");
        } else {
            System.out.println("Deteniendo motor electrico");
        }
    }

    public void desconectar() {
        System.out.println("Desconectando motor electrico...");
        this.conectado = false;
    }
}

//***********************************************************
//Implementamos una nueva clase Adaptador para MotorElectrico
//***********************************************************
package patrones;
import adaptador.Motor;

/**
 * Adaptamos la Clase foranea MotorElectrico envolviendolo en la Clase Motor
 * @author fprado
 */
public class MotorElectricoAdaptador extends Motor{
   
    private MotorElectrico motorElectrico;

    public MotorElectricoAdaptador(){
        //Instanciamos la Clase Motor
        super();
        //Instanciamos la Clase Foranea Motor Electrico
        //*********************************************
        this.motorElectrico = new MotorElectrico();
        System.out.println("Creando MotorElectricoAdaptador");
    }

    //Envolvemos (adaptamos) el metodo encender() de la clase Motor
    //al de la clase foranea MotorElectrico
    @Override
    public void encender() {
        System.out.println("Encendiendo MotorElectricoAdaptador");
        this.motorElectrico.conectar();
        this.motorElectrico.activar();
    }

    //Envolvemos (adaptamos) el metodo acelerar() de la clase Motor
    //al de la clase foranea MotorElectrico
    @Override
    public void acelerar() {
        System.out.println("Acelerando motor electrico...");
        this.motorElectrico.moverMasRapido();
    }

    //Envolvemos (adaptamos) el metodo apagar() de la clase Motor
    //al de la clase foranea MotorElectrico
    @Override
    public void apagar() {
        System.out.println("Apagando motor electrico");
        this.motorElectrico.detener();
        this.motorElectrico.desconectar();
    }
}

//****************************
//Probamos la clase adaptadora
//****************************
package patrones;
import adaptador.Motor;

/**
 *
 * @author fprado
 */
public class Patrones {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Motor motor = new MotorEconomico();
        motor.encender();
        motor.acelerar();
        motor.apagar();

        motor = new MotorAltoConsumo();
        motor.encender();
        motor.acelerar();
        motor.apagar();

        motor = new MotorElectricoAdaptador() ;
        motor.encender();
        motor.acelerar();
        motor.apagar();
    }
}