El siguiente código es un programa que valida el ingreso de usuarios, pidiendo la contraseña y el nombre del usuario respectivamente. En este programa implementamos el patrón Factory Method y Singleton.
Este programa tiene tres paquetes; un paquete que se llama bd y tiene la clase Conexion, otro que se llama interfaz y que tiene las clases MenuUsuario y Validacion, y por ultimo el paquete llamado logica que tiene las siguientes clases: TipoUsuario, Local, CreadorLocal, Remoto, CreadorRemoto, Corporativo, CreadorCorporativo, Comun, CreadorComun, Creador.
A continuacion veremos la clase Conexion que pertenece al paquete bd.
package bd;
import java.sql.*;
/**
* Clase encargada de realizar la conexion con la base de datos esta misma clase se encarga de consultar y hacer persistencia de datos.
*/
public class Conexion {
   static private String bd = "validacionUsuarios";
   static private String login = "root";
   static private String password = "programacion";
   static private String url = "jdbc:mysql://localhost/" + bd;
   static private Conexion conex = null;
   private String CadenaSql;
   private Connection conexion = null;
 /**
    * el contructor se encargada de realizar la conexion a la base de datos
    * y muestra en  consola mensajes si se pudo o no conectar a labase de datos.
    */
   static public Conexion getConexion() {
       if (conex == null) {
           conex = new Conexion();
       }
       return conex;
   }
   private Conexion() {
       try {
           System.out.println("Tratando de cargar el driver");
           Class.forName("com.mysql.jdbc.Driver");
           conexion = DriverManager.getConnection(url, login, password);
           if (conexion != null) {
               System.out.println("Conexion a base de datos " + bd + " OK");
           }
       } catch (SQLException sqlEx) {
           System.out.println(sqlEx);
       } catch (ClassNotFoundException ex) {
           System.out.println(ex);
       }
   }
/**
    *
    * Funcion encargada de realizar las consultas para poder usarla debe existir
    * una conexion a base de datos
    *
    *
    * @return ResultSet
    */
   public ResultSet Consultar() {
        ResultSet tabla = null;
        try {
                Statement stmt = conexion.createStatement();
                tabla = stmt.executeQuery(CadenaSql);
        } catch (SQLException ex) {
                System.out.println(ex);
        }
        return tabla;
   }
   /**
    * Setter que asigna el valor a la cadenaSql
    *
    * @param  String cadena;
    */
   public void setCadena(String cadena) {
           CadenaSql = cadena;
   }
    /**
    * getter que retorna
    *
    * @return  Connection;
    */
   public Connection getConectar() {
                   return conexion;
   }
   /**
    * Funcion encargada de realizar la desconexion a base de datos
    */
   public void desconectar() {
            conexion = null;
   }
   /**
    * Funcion encargada de retornar el objeto conexion y garantiza que la clase se instancie una sola vez.
    * @return   Conexion
    * @uml.property  name="conexion"
    */
}
ahora la clase MenuUsuario que pertenece al paquete interfaz
package interfaz;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import logica.TipoUsuario;
public class MenuUsuario extends Frame implements ActionListener {
            private Button salir;
            private JTextArea informacion;
            private TipoUsuario relacion;
            private Font fuente1;
            public MenuUsuario(TipoUsuario datos) {
                               this.setLayout(null);
                        this.setResizable(false);
                        relacion = datos;
                        this.setTitle("BIENVENIDO  " + " ***** " + relacion.getTipoUsuario() + " ***** ");
                        this.setSize(380, 280);
                        this.setLocation(200, 70);
                        this.setBackground(Color.BLACK);
                        salir = new Button("Salir");
                        salir.setBounds(160, 210, 70, 40);
                        salir.addActionListener(this);
                        add(salir);
                        informacion = new JTextArea();
                               informacion.setSize(250, 150);
                        informacion.setLocation(70, 50);
                           add(informacion);
       fuente1 = new Font("Helvética", Font.ITALIC + Font.ROMAN_BASELINE, 12);
       informacion.setFont(fuente1);
       informacion.setText(relacion.infor);
       this.setVisible(true);
       informacion.setForeground(Color.blue);
       informacion.setEditable(false);
       addWindowListener(new Cierre());
   }
   public void actionPerformed(ActionEvent e) {
       if (e.getSource() == salir) {
           System.exit(0);
       }
   }
}
class Cierre extends WindowAdapter {
   @Override
   public void windowClosing(WindowEvent e) {
       System.exit(0);
   }
}
y la clase Validacion que pertenece tambien al paquete interfaz
package interfaz;
import java.awt.event.*;
import java.awt.*;
import javax.swing.JOptionPane;
import logica.*;
public class Validacion extends Frame implements ActionListener {
   private Creador creador;
   private Label Usuario,  Clave;
   private TextField txfUs,  txfCl;
   private Button Salir,  Ingresar;
   private TipoUsuario us;
   public Validacion() {
       setLayout(null);
       this.setBackground(Color.BLACK);
       this.setResizable(false);
       Ingresar = new Button("Ingresar");
       creador = new CreadorLocal();
       us = creador.construir();
       Usuario = new Label("USUARIO :");
       Usuario.setForeground(Color.white);
       txfUs = new TextField(25);
       txfUs.setText(null);
       txfUs.setBackground(Color.white);
       Clave = new Label("CONTRASEÑA :");
       Clave.setForeground(Color.white);
       txfCl = new TextField(30);
       txfCl.setText(null);
       Salir = new Button("Cancelar");
       add(Usuario);
       Usuario.setBounds(30, 60, 90, 20);
       add(txfUs);
       txfUs.setBounds(195, 60, 170, 20);
       txfUs.addActionListener(this);
       add(Clave);
       Clave.setBounds(30, 90, 90, 20);
       add(txfCl);
       txfCl.setBounds(195, 90, 170, 20);
       txfCl.addActionListener(this);
       add(Ingresar);
       Ingresar.setBounds(50, 150, 90, 30);
       Ingresar.addActionListener(this);
       add(Salir);
       Salir.setBounds(250, 150, 90, 30);
       Salir.addActionListener(this);
       addWindowListener(new Cierre());
   }
   public static void main(String[] args) {
       Validacion miIngreso = new Validacion();
       miIngreso.setTitle("Validar Usuario y Contraseña");
       miIngreso.setLocation(400, 200);
       miIngreso.setSize(400, 200);
       miIngreso.setVisible(true);
   }
   public void actionPerformed(ActionEvent e) {
       if (e.getSource() == Ingresar) {
           if (txfUs.getText().length() != 0 && txfCl.getText().length() != 0) {
               us.setNombre(txfUs.getText());
               us.setClave(txfCl.getText());
               us.capturaRelacion();
               if (us.getExistencia() == true) {
                   if (us.getTipoUsuario().compareTo("local") == 0) {
                       creador = new CreadorLocal();
                       us = creador.construir();
                   }
                   if (us.getTipoUsuario().compareTo("remoto") == 0) {
                       creador = new CreadorRemoto();
                       us = creador.construir();
                   }
                   if (us.getTipoUsuario().compareTo("comun") == 0) {
                       creador = new CreadorComun();
                       us = creador.construir();
                   }
                   if (us.getTipoUsuario().compareTo("corporativo") == 0) {
                       creador = new CreadorCorporativo();
                       us = creador.construir();
                   }
                   this.dispose();
                   MenuUsuario MiMenu = new MenuUsuario(us);
                 
               } else {
                   JOptionPane.showMessageDialog(null,
                           "Usuario y/o contrase�a incorrectos ",
                           "Ingrese nuavamente sus datos", 0);
               }
           } else {
               JOptionPane.showMessageDialog(
                       null,
                       " Existen Campos en blanco, <
                       "Informacion Incompleta", 2);
           }
       }
       if (e.getSource() == Salir) {
           System.exit(0);
       }
   }
   class Cierre extends WindowAdapter {
       @Override
       public void windowClosing(WindowEvent e) {
           System.exit(0);
       }
   }
}
y ahora veremos todas las clases del paquete de logica
package logica;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import bd.Conexion;
public class Comun extends TipoUsuario {
   private Conexion con;  
   public Comun() {
       tipoUsuario = "Usuario comun";
       infor="Usted puede Visualizar:\n\n Usuarios del tipo remoto.\n Usuarios de su mismo tipo.";
   }
 
   public String getTipoUsuario() {
       return tipoUsuario;
   }
 
   public String getInformacion(){
       return infor;
   }
   @Override
   public void capturaRelacion() {
       existe = false;
       conexion.setCadena("SELECT * FROM registro where nombre ='"
               + this.getNombre() + "'");
       ResultSet tabla = conexion.Consultar();
       try {
           while (tabla.next()) {
               if (this.getClave().compareTo(tabla.getString("clave")) == 0) {
                   this.setTipo(tabla.getString("tipoUsuario"));
                   existe = true;
               }
           }
       } catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, "Problemas con la tabla");
       }
   }
}
package logica;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class Corporativo extends TipoUsuario {
   public Corporativo() {
       tipoUsuario = "Usuario corporativo";
               infor="Usted puede:\n\n Visualizar y modificar todos los tipos de usuario ";
   }
   public String getTipoUsuario() {
       return tipoUsuario;
   }
   public String getInformacion(){
       return infor;
   }
   @Override
   public void capturaRelacion() {
       existe = false;
       conexion.setCadena("SELECT * FROM registro where nombre ='" + this.getNombre() + "'");
       ResultSet tabla = conexion.Consultar();
       try {
           while (tabla.next()) {
               if (this.getClave().compareTo(tabla.getString("clave")) == 0) {
                   this.setTipo(tabla.getString("tipoUsuario"));
                   existe = true;
               }
           }
       } catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, "Problemas con la tabla");
       }
   }
}
package logica;
public abstract class Creador {
   public abstract TipoUsuario factoryMethod();
   public TipoUsuario construir() {
       TipoUsuario tipoUs = factoryMethod();
       return tipoUs;
   }
}
package logica;
public class CreadorComun extends Creador{
 
   public TipoUsuario factoryMethod()
   {
       return new Comun();
   }
}
package logica;
public class CreadorCorporativo extends Creador{
 
   public TipoUsuario factoryMethod()
   {
       return new Corporativo();
   }
}
package logica;
public class CreadorLocal extends Creador{
 
   public TipoUsuario factoryMethod()
   {
       return new Local();
   }
}
package logica;
public class CreadorRemoto extends Creador{
 
   public TipoUsuario factoryMethod()
   {
       return new Remoto();
   }
}
package logica;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import bd.Conexion;
public class Local extends TipoUsuario {
   public Local() {
       tipoUsuario = "Usuario local";
       infor = "Usted puede Visualizar:\n\n Usuarios de su mismo tipo.";
   }
   public String getTipoUsuario() {
       return tipoUsuario;
   }
   public String getInformacion() {
       return infor;
   }
   @Override
   public void capturaRelacion() {
       existe = false;
       conexion.setCadena("SELECT * FROM registro where nombre ='" + this.getNombre() + "'");
       ResultSet tabla = conexion.Consultar();
       try {
           while (tabla.next()) {
               if (this.getClave().compareTo(tabla.getString("clave")) == 0) {
                   this.setTipo(tabla.getString("tipoUsuario"));
                   existe = true;
               }
           }
       } catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, "Problemas con la tabla");
       }
   }
}
package logica;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class Remoto extends TipoUsuario {
   public Remoto() {
       this.tipoUsuario = "Usuario remoto";
       this.infor="Usted puede Visualizar:\n\n Usarios del tipo comun. \n Usuarios del tipo local. \n Usuarios de su mismo tipo.";
   }
   @Override
   public void capturaRelacion() {
       existe = false;
       conexion.setCadena("SELECT * FROM registro where nombre ='"
               + this.getNombre() + "'");
       ResultSet tabla = conexion.Consultar();
       try {
           while (tabla.next()) {
               if (this.getClave().compareTo(tabla.getString("clave")) == 0) {
                   this.setTipo(tabla.getString("tipoUsuario"));
                   existe = true;
               }
           }
       } catch (SQLException ex) {
           JOptionPane.showMessageDialog(null, "Problemas con la tabla");
       }
   }
}
package logica;
import bd.Conexion;
public abstract class TipoUsuario {
   static protected TipoUsuario usuario=null;
   protected String nombreUsuario;
   protected String claveUsuario;
   protected String tipoUsuario;
   protected boolean existe;
   protected Conexion conexion;
   public String infor;
   public TipoUsuario() {
       //Crea una instancia de la clase conexion
       conexion = Conexion.getConexion();
       existe = false;
     
       }
 
   public String getTipoUsuario(){      
           return tipoUsuario;
   }
 
   public String getNombre() {
       return nombreUsuario;
   }
   public String getClave() {
       return claveUsuario;
   }
   public void setNombre(String nombre) {
       this.nombreUsuario = nombre;
   }
   public void setClave(String clave) {
       this.claveUsuario = clave;
   }
   public boolean getExistencia(){
       return existe;
   }
 
   public void setTipo(String tipo){
       this.tipoUsuario=tipo;
   }
   public String getInformacion(){
       return infor;
   }
   public abstract void capturaRelacion();
}
 











