jueves, 2 de julio de 2015

Patrón de Diseño Factory Method con Harbour


Despues de ver como implementar un patron de diseño Singleton en Harbour,
http://xthefull.blogspot.com/2014/11/el-patron-de-diseno-singleton-en-harbour.html
le toca el turno al patrón de diseño del tipo Factory Method

Este patron de diseño correspopnde a los llamados Patrones Creacionales;

Centraliza en una clase constructora la creación de objetos de
un subtipo de un tipo determinado, ocultando al usuario la casuística, es decir,
la diversidad de casos particulares que se pueden prever, para elegir el subtipo que crear.
Parte del principio de que las subclases determinan la clase a implementar. 


https://es.wikipedia.org/wiki/Factory_Method_(patr%C3%B3n_de_dise%C3%B1o)


A continuación se muestra un ejemplo de este patrón en Harbour;
#include "hbclass.ch"

/* ------------------------------------------------------ */
/* Patron Diseño FACTORY Method                           */
/* ------------------------------------------------------ */


CLASS FACTORY
     DATA tipo PROTECTED

     METHOD New( Tipo )
     METHOD creaConexion( )

END CLASS

METHOD New( Tipo ) CLASS Factory
   ::Tipo := Tipo
RETURN Self

METHOD creaConexion() CLASS Factory
   Local oConexion

   do case
      case ::tipo = "MySql"
           oConexion := MySql():New()
      
      case ::tipo = "SqlServer"
           oConexion := SqlServer():New() 
      case ::tipo = "Sqlite3"
           oConexion := Sqlite3():New()
 

      otherwise
           oConexion := Conexion():New()
   end case

RETURN oConexion


/* ------------------------------------------------------ */
/* ------------------------------------------------------ */
 

CLASS CONEXION
     METHOD New() INLINE Self
     METHOD Descripcion() INLINE "Conexion Generica"
END CLASS
 

/* ------------------------------------------------------ */
/* ------------------------------------------------------ */
 

CLASS MySql FROM CONEXION
      METHOD New( ) INLINE Self
      METHOD Descripcion() INLINE "Conexion MySql"
END CLASS

/* ------------------------------------------------------ */
/* ------------------------------------------------------ */
 
CLASS SqlServer FROM CONEXION
      METHOD New( ) INLINE Self
      METHOD Descripcion() INLINE "Conexion SqlServer"

END CLASS
 
/* ------------------------------------------------------ */
/* ------------------------------------------------------ */
 
CLASS Sqlite3 FROM CONEXION
      METHOD New( ) INLINE Self
      METHOD Descripcion() INLINE "Conexion Sqlite3"

END CLASS



/* ------------------------------------------------------ */ 
// Ejemplo de uso : ./test MySql
/* ------------------------------------------------------ */

Function Main( cTipo )
   Local oFactory, oConexion

   oFactory  := Factory():New( cTipo )
   oConexion := oFactory:creaConexion()

   ? "Estamos conectados con " + oConexion:Descripcion()

RETURN nil