Esta semana estamos viendo en clase la utilidad de los patrones de diseño así que para el taller voy a utilizar dos patrones para mejorar mi código y para resolver un problema de forma eficiente.
Singleton
La clase "TextManager" y la clase "GUI" de mi proyecto solo necesitan una instancia pero en caso de que se crearan mas instancias seria molesto o correria riesgo el programa de fallas asi que para asegurar que eso no pase al continuar avanzando en el proyecto pense que este seria el patrón de diseño que me ayudaria.
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.
Y aquí las partes de cada clase donde implemento Singleton
singleton en la clase GUI :)
package mxText;
import javax.swing.*;
import java.awt.*;
public class GUI extends javax.swing.JFrame{
private int numerodeBotones;
private static GUI instancia = null;
private Sheet texto;
JPanel p1, p2;
JMenuBar barraMenu;
String[] jMenu={"Archivo","Editar","Abrir","Nuevo","Guardar","Guardar Como"};
private GUI(String titulo, JTabbedPane tabs){
super(titulo);
super.setTitle(titulo);
super.setLocation(0,0);
super.setSize(500,500);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setLayout(new BorderLayout());
p1 = new JPanel();
p2 = new JPanel();
super.add(p1,BorderLayout.CENTER);
p1.setLayout(new BorderLayout());
this.texto = texto;
//JScrollPane scrollb = new JScrollPane(this.texto);
//JTabbedPane tabs = tabs;
p1.setPreferredSize(new Dimension(20,5));
barraMenu = new JMenuBar();
super.add(p2,BorderLayout.NORTH);
super.setJMenuBar(barraMenu);
//tabs.addTab("archivo 1",scrollb);
p1.add(tabs, BorderLayout.CENTER);
super.setVisible(true);
}
private synchronized static void crearInstancia(String titulo, JTabbedPane tabs){
if(instancia == null){
instancia = new GUI( titulo, tabs);
}
}
public static GUI obtenerInstancia(String titulo, JTabbedPane tabs){
if(instancia == null)
crearInstancia(titulo, tabs);
return instancia;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
};
Singleton en la clase TextManager:
package mxText;
import javax.swing.JFileChooser;
import javax.swing.*;
import javax.swing.text.*;
import java.io.File;
import java.lang.StringBuffer;
import java.awt.event.*;
import java.util.*;
/**
* Sirve para trabajar con el texto de un archivo y prepararlo para imprimirlo en la pantalla o en una hoja.
* @author Max Hernandez
*/
public class TextManager implements ActionListener {
private static TextManager instancia = null;
String nombreDeArchivo=null;
Reader lector =null;
JTabbedPane hojas =null;
Writer escritor =null;
Compuesto tabs;
StringBuffer buffer = new StringBuffer();
File fichero;
JFileChooser fileChooser= new JFileChooser();
private TextManager(JTabbedPane hojas){}
private synchronized static void crearInstancia(){
if(instancia == null){
instancia = new TextManager();
}
}
public static TextManager obtenerInstancia(JTabbedPane hojas){
this.hojas=hojas;
tabs = new Compuesto(hojas);
if(instancia == null)
crearInstancia();
return instancia;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
};
Composite
Para abrir gran cantidad de archivos y administrarlos por el usuario ya había planeado usar JTabbedPane pero no sabia exactamente como estructurarlos, sabia que necesitaría una lista y un buen algoritmo.
El patrón "Composite" sirve para construir objetos complejos a partir de otros más simples y similares entre sí. entonces de cierta forma lo uso para agregar componentes al JTabbedPane utilizandolo como una lista. Gracias a esto puedo definir componentes con las caracteristicas que quiera y asi cumplir varias funciones como en mi ejemplo el unico componente que uso al mismo tiempo guarda informacion del archivo y objetos para que funcione correctamente.
Este es el pedazo de código de la clase "TextManager" donde se implementa este patron de diseño despues de esto para abrir archivos solo creo un obeto "Tab" con los parametros necesarios, un compuesto y voy añadiendo archivos.
abstract class Componente extends JScrollPane
{
public File archivo;
public Sheet hoja ;
public String nombreArchivo;
public Componente(File ar, String nF, Sheet hoja){
super(hoja);
this.archivo = ar;
this.hoja = hoja;
this.nombreArchivo = nF;
}
public Componente(){}
abstract public void Agregar(Componente c);
};
class Compuesto extends Componente
{
private ArrayListhijo = new ArrayList ();
private JTabbedPane tabs;
public Compuesto (JTabbedPane tabs){
this.tabs=tabs;
}
@Override
public void Agregar(Componente comp)
{
hijo.add(comp);
tabs.addTab(comp.nombreArchivo,comp);
}
};
class Tab extends Componente
{
public Tab (File fl, String nF, Sheet hoja)
{
super(fl,nF, hoja);
}
public void Agregar(Componente c)
{
System.out.println("no se puede agregar la tab");
}
public void Remover(Componente c)
}
System.out.println("no es posible completar la petición");
public void Mostrar(int depth)
{
System.out.println('-' + "" + nombreArchivo);
}
};
