sábado, 19 de marzo de 2011

POO - Clase 7: Diagrama de Secuencia y Patrones de Diseño


Explicaré los dos que me parecen útiles a primera vista.


Singleton:


La descripción que encontré es la siguiente:

"El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.
Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella."

Me parece útil en términos de memoria, ya que se evitaría instanciar una clase varias veces dentro de un mismo programa, aunque aun no veo muy bien como usarla aún, tengo algunas ideas para aplicarlo, o por lo menos intentar programarlo en alguna clase de menor importancia para comprenderlo mejor.. 
Aun así el código que encontré se ve muy entendible, y es el siguiente:
Nota: Los comentarios los coloqué yo para explicar como entendí su funcionamiento.



public class Singleton {
 //se crea un objeto del tipo Singleton y ae iguala a null(aun sin instanciar) 
 private static Singleton INSTANCE = null;      
 // Constructor privado, una de las formas de usar el patron Singleton, denegando accesos 
    
 private Singleton(){
 }
    // creador sincronizado para protegerse de posibles problemas multi-hilo
    // se puede ver que es una funcion estatica, no es necesario instanciar para usarla      
 
 private synchronized static void createInstance() { 
        if (INSTANCE == null) { //verifica si existe una instancia 
            INSTANCE = new Singleton(); //si no existe, crea una nueva 
        } 
    } 
 /*En vez de instanciar una clase, al usar este metodo estatico, se crea un objeto si no existe uno ya,
 al ser estatico no seria necesario llamarlo instanciando y usando la forma objeto.getInstance() */     
 public static Singleton getInstance(){
  if (INSTANCE == null) {
   createInstance();
   return INSTANCE; 
  }
  return INSTANCE; 
 }
 
}
Nombre: Memento                   Clasificación: Comportamiento


"El patrón de diseño Memento, tiene como finalidad almacenar el estado de un objeto (o del sistema completo) en un momento dado de manera que se pueda restaurar en ese punto de manera sencilla. Para ello se mantiene almacenado el estado del objeto para un instante de tiempo en una clase independiente de aquella a la que pertenece el objeto (pero sin romper la encapsulación), de forma que ese recuerdo permita que el objeto sea modificado y pueda volver a su estado anterior."


El momento en el que leí "almacenar el estado de un objeto (sistema completo) me pareció muy útil. Lo podría usar para volver a estados pasados si ocurre algún error en ciertos tipos de sistema o algo por el estilo, más quizás no me sirva en mi proyecto. 
El ejemplo:
import java.util.*;
 
class Memento 
{
    private String state;
 
    public Memento(String stateToSave)
    {
        state = stateToSave; 
    }
 
    public String getSavedState()
    {
        return state; 
    }
}
 
class Originator 
{
    private String state;
    /* lots of memory consumptive private data that is not necessary to define the 
     * state and should thus not be saved. Hence the small memento object. */
 
    public void set(String state) 
    { 
       System.out.println("Originator: Setting state to "+state);
       this.state = state; 
    }
 
    public Memento saveToMemento() 
    { 
        System.out.println("Originator: Saving to Memento.");
        return new Memento(state); 
    }
 
    public void restoreFromMemento(Memento m) 
    {
        state = m.getSavedState(); 
        System.out.println("Originator: State after restoring from Memento: "+state);
    }
}   
 
class Caretaker {
   private ArrayList savedStates = new ArrayList();
 
   public void addMemento(Memento m) { savedStates.add(m); }
   public Memento getMemento(int index) { return savedStates.get(index); }
}   
 
class MementoExample {
   public static void main(String[] args) {
       Caretaker caretaker = new Caretaker();
 
       Originator originator = new Originator();
       originator.set("State1");
       originator.set("State2");
       caretaker.addMemento( originator.saveToMemento() );
       originator.set("State3");
       caretaker.addMemento( originator.saveToMemento() );
       originator.set("State4");
 
       originator.restoreFromMemento( caretaker.getMemento(1) );
   }
}


Diagrama de Secuencia:


El diagrama de secuencia que realice es para el caso en el que un administrador hace login en el sistema  como tal, y agrega la información de un cliente a la base de datos.

El diagrama es el siguiente:

Explicación:

Como se aprecia en la imagen lo primero que hace el administrador es iniciar el programa, después de esto el programa genera un Login, el cual pide los datos para poder ingresar al sistema, al ingresarlos correctamente se abre una interfaz gráfica, y esta solicita cierta información para realizar tareas, en este caso agregar un cliente a la base de datos. 
Por lo tanto al agregarse, se crea un ID con esos datos utilizando la clase ID. Devuelve el ID a la base de datos y lo guarda, y se confirma que se agrego el cliente.



Referencias:

No hay comentarios:

Publicar un comentario