SingletonPattern (VFP)

From codeWiki
Revision as of 05:43, 10 April 2012 by VictorEspina (Talk | contribs)
Jump to: navigation, search

Introduccion

El patron Singleton permite definir una clase que devuelve una referencia a una unica instancia de la misma cada vez que se intenta crear una nueva instancia. Este patron es sumamente util cuando se desea manejar informacion comun a lo largo de la aplicacion y no se cuenta con clases estaticas, como es el caso de VFP.


Clase SingletonPattern

La clase SingletonPattern sirve como clase base para lograr convertir una clase cualquiera en un singleton. Lo unico que necesitamos es crear una clase basada en SingletonPattern que sera la que se instanciara a lo largo del progtrama, y la clase "real" que proporcionara la funcionalidad requerida.

Ejemplo:

* appContextClass es la clase real
DEFINE CLASS appContextClass AS Custom
 Usuario = ""
 Empresa = ""
ENDDEFINE
* appContext es la clase singleton que servira de puente para la clase real
DEFINE CLASS appContext AS SingletonPattern
 className = "appContextClass"
ENDDEFINE

Una vez hecho esto, toda instancia de appContext apuntara a una unica instancia de appContextClass:

LOCAL o1, o2
o1 = CREATE("appContext")
o2 = CREATE("appContext")
o1.Usuario = "VESPINA"
?o2.Usuario --> "VESPINA"

La idea de usar dos clases es una forma de permitir aplicar el patron a cualquier clase y no necesariamente una basada en Custom. Sin embargo, si nuestra clase puede heredar de Custom entonces podemos simplemente heredar directamente de SingletonPattern:

DEFINE CLASS appContext AS SingletonPattern
 Usuario = ""
 Empresa = ""
ENDDEFINE

Codigo Fuente

* SingletonPattern
* Clase para la implementacion del pattern Singleton en VFP
*
* Autor: Victor Espina
* Fecha: Abril 2012
*
* Uso:
* Para la implementacion de esta clase se requiere definir dos clases
* a) Una clase basada en SingletonPattern
* b) La clase real que se desea implementar como Singleton, la cual puede
*    estar basada en cualquier clase base o subclase.
*
* Ejemplo:
* Supongamos que tenemos una clase llamada AppContextClass que queremos
* implementar como singleton.  Lo unico que se debe hacer es declarar
* una clase basada en SingletonPattern y configurar su propiedad className:
*
* DEFINE CLASS appContext AS SingletonPattern
*  className = "appContextClass"
* ENDDEFINE
*
* Luego, cuando se desee crear una instancia de AppContextClass, se hace:
*
* oSingletonInstance = CREATE("appContext")
*
* Y se lograra el efecto de que todas las instancias de appContext apuntaran a
* una unica instancia de appContextClass.
*
* 
DEFINE CLASS SingletonPattern AS Custom
 *
 className = ""
 
 PROCEDURE Init()
  IF NOT THIS.checkInstance()
   THIS.createInstance()
  ENDIF
 ENDPROC
 
 PROCEDURE checkInstance
  IF NOT ISNULL(THIS.getInstance())
   RETURN .T.
  ENDIF
  IF !PEMSTATUS(_Screen,THIS.className, 5)
   _Screen.addProperty(THIS.className, NULL)
  ENDIF
  RETURN .F.
 ENDPROC
 
 PROCEDURE createInstance
  LOCAL oInstance
  oInstance = CREATE(THIS.className)
  STORE oInstance TO ("_Screen." + THIS.className)
 ENDPROC
 
 PROCEDURE getInstance
  IF !PEMSTATUS(_Screen,THIS.ClassName,5) OR TYPE("_Screen." + THIS.className)<>"O"
   RETURN NULL
  ENDIF
  RETURN EVAL("_Screen." + THIS.className)
 ENDPROC
 
 PROCEDURE THIS_Access(cMember)
  IF INLIST(LOWER(cMember),"classname","checkinstance","createinstance","getinstance")
   RETURN THIS
  ELSE
   RETURN EVAL("_Screen." + THIS.className)
  ENDIF
 ENDPROC
 *
ENDDEFINE
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox