La creación de una verdadera clase singleton en delphi


El artículo describe cómo crear una clase que sigue el patrón singleton. La clase descrita se hará cargo de la singleton requisitos y efectos de la misma, de manera efectiva, dejando al programador a utilizar la clase como la de los demás.
Un singleton es una clase que apoya la creación de un solo objeto. Es como el equipo, sólo hay un teclado. Así que si usted fuera a escribir el código de Delphi que simulaba su computadora, usted desea sólo una instancia del objeto a tratar con teclado leer, escribir, y las actividades de control.
Artículos acerca de singleton clases son raras, pero hay un par en Internet. He visto algunos en revistas demasiado. Pero ninguno de estos artículos incluyen el código de ejemplo para crear una verdadera clase singleton.
Por 'real' me refiero a que la propia clase impone la instancia requisito, en lugar de dejar esa tarea para el programador. Todos los artículos que he visto hasta el momento han requerido al programador a utilizar la clase de una manera especial para hacer cumplir el patrón singleton.
En este artículo podrás ver cómo crear una clase singleton que incluye la lógica para hacer cumplir la instancia de la regla.
Nota: El método convencional, en el que la instancia de la regla se mantiene explícitamente por el programador, no es ningún mérito. Real singleton clases como la que os presentamos a continuación de manera efectiva ocultar los detalles y la conciencia de que el patrón singleton para el programador. El programador es liberado de la tarea de hacer cumplir el patrón-eso es bueno, pero el programador puede también ser conscientes de la especial naturaleza de la clase, lo que es malo. Si usted no sabe que la clase es una clase singleton, a continuación, todos los tipos de error que pueden aparecer. Usted ha sido advertido!
Escribir el código
Nuestro objetivo es escribir una clase que puede ser utilizado como esta:

procedimiento de Prueba
var
& nbsp & nbsp s1, s2 : TSingleton
begin
& nbsp & nbsp s1 := TSingleton.Crear
& nbsp & nbsp s2 := TSingleton.Crear
& nbsp & nbsp // Hacer algo con s1 y s2 aquí
& nbsp & nbsp s2.Libre
& nbsp & nbsp s1.Libre
fin


(que he dejado fuera el try...finally bloques y otras salvaguardias por razones de simplicidad.)
El objetivo es hacer que el TSingleton clase de comportarse de tal manera que ambos s1 y s2 se refieren al mismo objeto. Aquí es lo que tenemos que hacer:


  • crear una Instancia del objeto de la primera hora de Crear se llama (cuando s1 es creado anteriormente)
  • Asegurar que, cuando la otra Crear ejecutado (s2 arriba), el objeto existente es reutilizar en lugar de otro creado
  • Evitar la destrucción del objeto cuando no es la última referencia que se destruye (cuando s2 es liberado)
  • Destruir la instancia cuando la última referencia es destruida (cuando s1 es liberado por encima)


hay una forma de anular la creación y destrucción de un objeto nuevo en Delphi? ¡No es seguro. En la clase TObject (la madre de todos los objetos {juego de palabras la intención}), existen dos métodos que puede utilizar:

función de la clase NewInstance: TObject virtual
procedimiento FreeInstance virtual


NewInstance es responsable de la asignación de memoria para almacenar una nueva instancia de la clase, y FreeInstance es responsable de liberar la memoria cuando la clase es a través de él.
Estos métodos de control de lo que sucede cuando el objeto es creado y cuando se destruye el objeto. Si queremos sobrescribir este código, podemos modificar el comportamiento predeterminado para trabajar el decir que una clase singleton requiere. Nada.
el Seguimiento de los casos es un poco más complicado. Debemos:


  1. seguimiento de cada instancia de nuestra clase
  2. llevar un seguimiento de cuántas referencias hay a esta instancia
  3. Crear un nuevo objeto sólo cuando no existe ninguna instancia
  4. Destruir el objeto cuando la última referencia es eliminado


Para seguir la pista de una instancia existente, vamos a utilizar una variable global. En realidad, la variable en última instancia, serán declarados en el interior de la parte de la Implementación de una unidad por lo que no será un verdadero variable global. Pero el ámbito de aplicación debe ser suficiente para realizar un seguimiento de todas las Crear y llamadas Gratis. Vamos a llamar a la variable de Instancia para que sepamos de qué se trata.
Como para mantener un seguimiento de cómo existen muchas referencias, necesitamos otra variable. Podemos dentro de la clase o hacer una especie de mundial como Ejemplo. Voy a optar por este último camino, pero haz lo que sientas que es lo mejor. Voy a nombre de esta variable Ref_Count.
ahora Tenemos dos variables:

var
& nbsp & nbsp Ejemplo : TSingleton = nil
& nbsp & nbsp Ref_Count : Integer = 0


yo inicializar las variables, de modo que, inicialmente, no contienen ninguna de basura. Sé que el compilador lo hace automáticamente, así que esto es sólo un problema de legibilidad.
vamos a declarar la TSingleton de clase por encima de la variable de bloque, y si usted echa un vistazo a los archivos de ejemplo que se puede descargar al final de este artículo verás que he puesto de la declaración en la parte de la interfaz de la unidad, de manera que es visible fuera de él.

Aquí está la declaración de la TSingleton clase:

tipo
& nbsp & nbsp TSingleton = clase
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp función de la clase NewInstance: TObject reemplazar
& nbsp & nbsp & nbsp & nbsp procedimiento FreeInstance reemplazar
& nbsp & nbsp & nbsp & nbsp función de la clase RefCount: Integer
& nbsp & nbsp final


he añadido el Recuento de la función, de modo que podemos ver que realmente funciona, y es a menudo útil para ser capaz de leer cómo muchas referencias a que el objeto existe. No es necesario, sin embargo, para que usted no tiene que añadirlo a su singleton clases si no la necesita.
bien, ahora, para la aplicación de los tres métodos:

procedimiento TSingleton.FreeInstance
begin
& nbsp & nbsp Dic( Ref_Count )
& nbsp & nbsp si ( Ref_Count = 0 ) entonces
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Ejemplo := nil
& nbsp & nbsp & nbsp & nbsp // Destruir variables privadas aquí
& nbsp & nbsp & nbsp & nbsp heredado FreeInstance
& nbsp & nbsp final
fin
función de la clase TSingleton.NewInstance: TObject
begin
& nbsp & nbsp si ( no Asignado( Ejemplo )
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Ejemplo := heredado NewInstance
& nbsp & nbsp & nbsp & nbsp // Inicializar variables privadas aquí, como esta:
& nbsp & nbsp & nbsp & nbsp // TSingleton(Resultado).Variable := Valor
& nbsp & nbsp final
& nbsp & nbsp Resultado := Ejemplo
& nbsp & nbsp Inc( Ref_Count )
fin
función de la clase TSingleton.RefCount: Integer
begin
& nbsp & nbsp Resultado := Ref_Count
fin


Y eso es todo!
Cuando usted llame TSingleton del constructor, se hace una llamada al método NewInstance declarado en TObject. Este método asigna memoria para almacenar el nuevo objeto y se la devuelve al constructor. El constructor que utiliza la memoria y, finalmente, devuelve un puntero a la memoria el código que llama al constructor. Este puntero se suele almacenar en una variable, mientras que el objeto está en uso.
he reemplazado el método NewInstance de modo que se asigne la memoria sólo si no hay ninguna instancia de la clase existe. Si hay una instancia existente, la función devuelve simplemente esa instancia, el constructor así que va a ser reutilizado.
Si llamamos al constructor de tres veces, se crea un objeto sólo la primera vez. Los otros dos llamadas simplemente reutilizar el primer objeto. La referencia de la variable de recuento de hacernos saber que tenemos tres referencias a la instancia única.
Cuando el programa llama al destructor, una llamada a FreeInstance se coloca para liberar la memoria asignada en el constructor. Este método, también, es reemplazado para que el objeto se destruye sólo cuando la última referencia es eliminado.
Si usted va a utilizar un singleton en un programa multiproceso, tratar el objeto como lo haría con cualquier variable que se comparten entre los hilos. Porque eso es justo lo que debe hacer: compartir entre los hilos. Así que usted debe tener especial cuidado al cambiar los datos.
la Simplicidad de sí mismo
Como se puede ver, la creación de una clase singleton no requiere mucho esfuerzo, sólo el derecho de conocimientos y un par de líneas de código. Mi código funciona bien en Delphi 5. La técnica probablemente va a funcionar bien con las versiones anteriores de Delphi, pero yo no lo he probado, así que no hacer ningún tipo de garantía.
Antes de que le dé el archivo para jugar con el, te voy a dar unas palabras de advertencia.


  • no descienden de una clase singleton. La razón para esto es que sólo hay una instancia de referencia y variable de recuento. Si usted se derivan dos clases de TSingleton, un solo objeto será creado. La otra clase para la reutilización de ese objeto, que será una instancia de una clase diferente. No van por ese camino!
  • Usted no puede hacer singleton componentes por la simple razón de la propiedad. Un componente es propiedad de un formulario y un componente no puede ser propiedad de varios otros componentes.
  • Recuerde que el constructor y el destructor se llama para cada nueva referencia, ya que se crea y se destruye. No inicializar variables privadas en el constructor y no libre en el destructor. En su lugar, crear ese código en el NewInstance y la FreeInstance métodos, como se muestra en los comentarios.
  • La orden de ajuste de Ref_Count en los dos métodos en conjunto con el resto del código en los dos métodos es fundamental. Tiene que ver con la creación y la destrucción cuando algo va mal. Si su código de inicialización se produce una excepción, el orden de hacer las cosas como se muestra arriba se asegúrese de que la clase es destruido correctamente. Alterar este código en tu propio riesgo!
    El archivo que puedes descargar es sólo una copia de la unidad que se declara la clase singleton se describe en este artículo.
    Link a archivo: CodeCentral entrada 15083.
    estoy seguro que usted puede encontrar un par de lugares donde una clase singleton viene muy bien y ahora tienes las herramientas para crear su propio! Si quieres ponerte en contacto conmigo, mi correo es [email protected]
    Feliz de programación!









La creacion de una verdadera clase singleton en delphi


La creacion de una verdadera clase singleton en delphi : Multi-millones de consejos para hacer su vida mas facil.


El articulo describe como crear una clase que sigue el patron singleton. La clase descrita se hara cargo de la singleton requisitos y efectos de la misma, de manera efectiva, dejando al programador a utilizar la clase como la de los demas.
Un singleton es una clase que apoya la creacion de un solo objeto. Es como el equipo, solo hay un teclado. Asi que si usted fuera a escribir el codigo de Delphi que simulaba su computadora, usted desea solo una instancia del objeto a tratar con teclado leer, escribir, y las actividades de control.
Articulos acerca de singleton clases son raras, pero hay un par en Internet. He visto algunos en revistas demasiado. Pero ninguno de estos articulos incluyen el codigo de ejemplo para crear una verdadera clase singleton.
Por 'real' me refiero a que la propia clase impone la instancia requisito, en lugar de dejar esa tarea para el programador. Todos los articulos que he visto hasta el momento han requerido al programador a utilizar la clase de una manera especial para hacer cumplir el patron singleton.
En este articulo podras ver como crear una clase singleton que incluye la logica para hacer cumplir la instancia de la regla.
Nota: El metodo convencional, en el que la instancia de la regla se mantiene explicitamente por el programador, no es ningun merito. Real singleton clases como la que os presentamos a continuacion de manera efectiva ocultar los detalles y la conciencia de que el patron singleton para el programador. El programador es liberado de la tarea de hacer cumplir el patron-eso es bueno, pero el programador puede tambien ser conscientes de la especial naturaleza de la clase, lo que es malo. Si usted no sabe que la clase es una clase singleton, a continuacion, todos los tipos de error que pueden aparecer. Usted ha sido advertido!
Escribir el codigo
Nuestro objetivo es escribir una clase que puede ser utilizado como esta:

procedimiento de Prueba
var
& nbsp & nbsp s1, s2 : TSingleton
begin
& nbsp & nbsp s1 := TSingleton.Crear
& nbsp & nbsp s2 := TSingleton.Crear
& nbsp & nbsp // Hacer algo con s1 y s2 aqui
& nbsp & nbsp s2.Libre
& nbsp & nbsp s1.Libre
fin


(que he dejado fuera el try...finally bloques y otras salvaguardias por razones de simplicidad.)
El objetivo es hacer que el TSingleton clase de comportarse de tal manera que ambos s1 y s2 se refieren al mismo objeto. Aqui es lo que tenemos que hacer:


  • crear una Instancia del objeto de la primera hora de Crear se llama (cuando s1 es creado anteriormente)
  • Asegurar que, cuando la otra Crear ejecutado (s2 arriba), el objeto existente es reutilizar en lugar de otro creado
  • Evitar la destruccion del objeto cuando no es la ultima referencia que se destruye (cuando s2 es liberado)
  • Destruir la instancia cuando la ultima referencia es destruida (cuando s1 es liberado por encima)


hay una forma de anular la creacion y destruccion de un objeto nuevo en Delphi? ¡No es seguro. En la clase TObject (la madre de todos los objetos {juego de palabras la intencion}), existen dos metodos que puede utilizar:

funcion de la clase NewInstance: TObject virtual
procedimiento FreeInstance virtual


NewInstance es responsable de la asignacion de memoria para almacenar una nueva instancia de la clase, y FreeInstance es responsable de liberar la memoria cuando la clase es a traves de el.
Estos metodos de control de lo que sucede cuando el objeto es creado y cuando se destruye el objeto. Si queremos sobrescribir este codigo, podemos modificar el comportamiento predeterminado para trabajar el decir que una clase singleton requiere. Nada.
el Seguimiento de los casos es un poco mas complicado. Debemos:


  1. seguimiento de cada instancia de nuestra clase
  2. llevar un seguimiento de cuantas referencias hay a esta instancia
  3. Crear un nuevo objeto solo cuando no existe ninguna instancia
  4. Destruir el objeto cuando la ultima referencia es eliminado


Para seguir la pista de una instancia existente, vamos a utilizar una variable global. En realidad, la variable en ultima instancia, seran declarados en el interior de la parte de la Implementacion de una unidad por lo que no sera un verdadero variable global. Pero el ambito de aplicacion debe ser suficiente para realizar un seguimiento de todas las Crear y llamadas Gratis. Vamos a llamar a la variable de Instancia para que sepamos de que se trata.
Como para mantener un seguimiento de como existen muchas referencias, necesitamos otra variable. Podemos dentro de la clase o hacer una especie de mundial como Ejemplo. Voy a optar por este ultimo camino, pero haz lo que sientas que es lo mejor. Voy a nombre de esta variable Ref_Count.
ahora Tenemos dos variables:

var
& nbsp & nbsp Ejemplo : TSingleton = nil
& nbsp & nbsp Ref_Count : Integer = 0


yo inicializar las variables, de modo que, inicialmente, no contienen ninguna de basura. Se que el compilador lo hace automaticamente, asi que esto es solo un problema de legibilidad.
vamos a declarar la TSingleton de clase por encima de la variable de bloque, y si usted echa un vistazo a los archivos de ejemplo que se puede descargar al final de este articulo veras que he puesto de la declaracion en la parte de la interfaz de la unidad, de manera que es visible fuera de el.

Aqui esta la declaracion de la TSingleton clase:

tipo
& nbsp & nbsp TSingleton = clase
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp funcion de la clase NewInstance: TObject reemplazar
& nbsp & nbsp & nbsp & nbsp procedimiento FreeInstance reemplazar
& nbsp & nbsp & nbsp & nbsp funcion de la clase RefCount: Integer
& nbsp & nbsp final


he añadido el Recuento de la funcion, de modo que podemos ver que realmente funciona, y es a menudo util para ser capaz de leer como muchas referencias a que el objeto existe. No es necesario, sin embargo, para que usted no tiene que añadirlo a su singleton clases si no la necesita.
bien, ahora, para la aplicacion de los tres metodos:

procedimiento TSingleton.FreeInstance
begin
& nbsp & nbsp Dic( Ref_Count )
& nbsp & nbsp si ( Ref_Count = 0 ) entonces
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Ejemplo := nil
& nbsp & nbsp & nbsp & nbsp // Destruir variables privadas aqui
& nbsp & nbsp & nbsp & nbsp heredado FreeInstance
& nbsp & nbsp final
fin
funcion de la clase TSingleton.NewInstance: TObject
begin
& nbsp & nbsp si ( no Asignado( Ejemplo )
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Ejemplo := heredado NewInstance
& nbsp & nbsp & nbsp & nbsp // Inicializar variables privadas aqui, como esta:
& nbsp & nbsp & nbsp & nbsp // TSingleton(Resultado).Variable := Valor
& nbsp & nbsp final
& nbsp & nbsp Resultado := Ejemplo
& nbsp & nbsp Inc( Ref_Count )
fin
funcion de la clase TSingleton.RefCount: Integer
begin
& nbsp & nbsp Resultado := Ref_Count
fin


Y eso es todo!
Cuando usted llame TSingleton del constructor, se hace una llamada al metodo NewInstance declarado en TObject. Este metodo asigna memoria para almacenar el nuevo objeto y se la devuelve al constructor. El constructor que utiliza la memoria y, finalmente, devuelve un puntero a la memoria el codigo que llama al constructor. Este puntero se suele almacenar en una variable, mientras que el objeto esta en uso.
he reemplazado el metodo NewInstance de modo que se asigne la memoria solo si no hay ninguna instancia de la clase existe. Si hay una instancia existente, la funcion devuelve simplemente esa instancia, el constructor asi que va a ser reutilizado.
Si llamamos al constructor de tres veces, se crea un objeto solo la primera vez. Los otros dos llamadas simplemente reutilizar el primer objeto. La referencia de la variable de recuento de hacernos saber que tenemos tres referencias a la instancia unica.
Cuando el programa llama al destructor, una llamada a FreeInstance se coloca para liberar la memoria asignada en el constructor. Este metodo, tambien, es reemplazado para que el objeto se destruye solo cuando la ultima referencia es eliminado.
Si usted va a utilizar un singleton en un programa multiproceso, tratar el objeto como lo haria con cualquier variable que se comparten entre los hilos. Porque eso es justo lo que debe hacer: compartir entre los hilos. Asi que usted debe tener especial cuidado al cambiar los datos.
la Simplicidad de si mismo
Como se puede ver, la creacion de una clase singleton no requiere mucho esfuerzo, solo el derecho de conocimientos y un par de lineas de codigo. Mi codigo funciona bien en Delphi 5. La tecnica probablemente va a funcionar bien con las versiones anteriores de Delphi, pero yo no lo he probado, asi que no hacer ningun tipo de garantia.
Antes de que le de el archivo para jugar con el, te voy a dar unas palabras de advertencia.


  • no descienden de una clase singleton. La razon para esto es que solo hay una instancia de referencia y variable de recuento. Si usted se derivan dos clases de TSingleton, un solo objeto sera creado. La otra clase para la reutilizacion de ese objeto, que sera una instancia de una clase diferente. No van por ese camino!
  • Usted no puede hacer singleton componentes por la simple razon de la propiedad. Un componente es propiedad de un formulario y un componente no puede ser propiedad de varios otros componentes.
  • Recuerde que el constructor y el destructor se llama para cada nueva referencia, ya que se crea y se destruye. No inicializar variables privadas en el constructor y no libre en el destructor. En su lugar, crear ese codigo en el NewInstance y la FreeInstance metodos, como se muestra en los comentarios.
  • La orden de ajuste de Ref_Count en los dos metodos en conjunto con el resto del codigo en los dos metodos es fundamental. Tiene que ver con la creacion y la destruccion cuando algo va mal. Si su codigo de inicializacion se produce una excepcion, el orden de hacer las cosas como se muestra arriba se asegurese de que la clase es destruido correctamente. Alterar este codigo en tu propio riesgo!
    El archivo que puedes descargar es solo una copia de la unidad que se declara la clase singleton se describe en este articulo.
    Link a archivo: CodeCentral entrada 15083.
    estoy seguro que usted puede encontrar un par de lugares donde una clase singleton viene muy bien y ahora tienes las herramientas para crear su propio! Si quieres ponerte en contacto conmigo, mi correo es [email protected]
    Feliz de programacion!


La creación de una verdadera clase singleton en delphi

La creación de una verdadera clase singleton en delphi : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación