Social Icons

twitterfacebookgoogle pluslinkedinrss feedemail

Pages, oficial

jueves, 29 de marzo de 2012

Instancia Única de un Formulario con Patrón Singleton

Cuando empezamos a programar con  Windows Forms  la instanciación de un formulario es  básica, pero se presenta un problema  la múltiple instanciación, en nuestras aplicaciones deseamos que solo haya una instancia de un formulario caso contrario el usuario puede complicar su entorno en la aplicación .

Cuando un formulario se llama por su método  SHOWDIALOG() no necesita  esta  solución, ni tampoco se puede asociar a un formulario padre.

En esta oportunidad veremos como  instanciar solo una vez  con ayuda del patrón singleton,  si no estás enterado que son patrones,  puedes leerlo aquí, los patrones  son soluciones a problemas comunes de diseño de software y con esto me refiero mas propiamente al diseño de clases. 

En este ejemplo crearemos un un formulario padre  que albergue dos formularios de los cuales uno sera singleton  y otro simple.

Formulario padre



En propiedades de formulario  IsMdiContainer  valor true para que tenga un comportamiento de  formulario padre, en este caso usé el control toolStrip para llamar a la creación de formularios y también para cerrarlos,  posteriormente   añadí  dos formularios, como vemos a continuacion,  FormSimple, FormSingleton.    

Explorador de soluciones de Visual Estudio 2010

Bién nos concentraremos en el formulario Singleton es el que nos interesa, el formulario simple lo añadi solo para ver la diferencia no tiene ninguna característica particular.

A continuación las lineas de codigo del formulario singleton:

 public partial class FormSingleton : Form
    {

        private static FormSingleton InstanciaFormulario = null;

        public FormSingleton()
        {
            InitializeComponent();
        }

        public static FormSingleton Instance()
        {
            if (InstanciaFormulario == null)
            {
                InstanciaFormulario = new FormSingleton();
            }
            return InstanciaFormulario;
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);

            InstanciaFormulario = null;
        }


    }


Analizando el código, en la cabecera de la clase declaramos como un tipo privado estático de  la misma clase del Formulario Singleton.
 Después creamos un método estático publico del mismo tipo del formulario  que  verificara la existencia de  la instancia,  y que devuelve el formulario instanciado.
Y por ultimo  modificar  método Dispose añadiendo  la linea  de código InstanciaFormulario = null;  al final,  este método se crea por defecto al agregar un formulario al proyecto,  podemos encontrarlo haciendo clic derecho sobre   InitializeComponent(); del método constructor del Formulario,   e  Ir a Definición ; como vemos en la siguiente imagen.


Accediendo a la definición de InitializeComponent()

En este caso yo elimine el método Dispose de la Clase  parcial  Desinger.cs  del Formulario ,  poniéndola en la clase que generalmente usamos para programar.

EL método dispose de un formulario se ocupa de liberar todo los componentes que pertenecen al formulario como por ejemplo los controles,  este se ejecuta cuando el formulario se cierra,  en este caso aprovechamos para convertir nula la instancia del formulario.

A continuación  el código del Formulario padre:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripLabel1_Click(object sender, EventArgs e)
        {
            //corresponde al boton creacion formulario simple
           
            FormSimple FormularioSimple = new FormSimple();

            FormularioSimple.MdiParent = this;

            FormularioSimple.Show();

        }

        private void toolStripLabel2_Click(object sender, EventArgs e)
        {
           //corresponde al boton creacion Formulario Singleton


           FormSingleton FormularioSingleton = FormSingleton.Instance();

            FormularioSingleton.MdiParent = this;

            FormularioSingleton.Show();
        }

        private void toolStripLabel3_Click(object sender, EventArgs e)
        {
             // Cerrar todos los formulario hijos creados

           foreach (Form ChildForm in this.MdiChildren)
          
            {
                ChildForm.Close();
            }
        }
    }


Analizando el código del formulario padre, el método que usamos para la creación del formulario singleton  es el evento toolStripLabel2_Click , accediendo al método estático del formulario  Instantce()  que resuelve la instanciación del mismo.

Los métodos estáticos son una característica de las Clases singleton,  uno puede acceder a estos métodos o clases  sin necesidad de instanciarlos.

Y el método para cerrar todos los formulario hijos abiertos definido por el evento toolStripLabel3_Click  puede ser considerado un tip en Windows Forms, muy útil para despejar la vista del usuario.

Presentamos en un Slide de imágenes la aplicación: 


Imágenes de la aplicación.

Mas adelante veremos la aplicación de patrones a  proyectos de software, si duda un tema muy interesante.