Introducción
El patrón de diseño Singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.
Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.
El patrón Singleton se implementa creando en nuestra clase un método que cree una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).
Creación y configuración del Singleton
Ejecutamos la transacción SE24 para acceder al generador de clases y creamos una clase global con el nombre ZCL_SINGLETON.
Al crear la clase, seleccionamos Privado como tipo de instancias. Este control de encapsulación nos indica cómo se crea una instancia del objeto.
En otras palabras, la sentencia CREATE OBJETO para este objeto solo se puede escribir dentro de la clase.
Dado que para Singleton lo que deseamos obtener es el mismo objeto de nuevo si ya se ha creado anteriormente, por eso es necesario controlar la forma en que el objeto se va instanciar.
Luego tenemos que crear un atributo en la clase que almacene la referencia del objeto. Éste tiene que ser estático, ya que necesita mantener la referencia del objeto a lo largo del período de sesiones o de transacciones.
Al igual que la clase, el atributo SINGLETON, va a tener Private como visibilidad. Lo que intentamos conseguir es instanciar solo una vez el objeto y almacenar la instancia en el atributo SINGLETON y no permitir a nadie que nos modifique el valor del atributo (por ejemplo, hacer un CLEAR sobre el).
Ahora tenemos que permitir que se obtenga la única referencia del objeto fuera de la clase. Así que creamos un método que se encarga de instanciar el objeto y devolverlo. Dado que hemos declarado la creación de instancias de objetos como privada, necesitamos crear una instancia del objeto dentro de la propia clase. Este método sería responsable de hacer exactamente eso.
Tendremos que añadir un parámetro de retorno a este método del tipo objeto de la clase para poder ser pasado de vuelta al cliente.
Llamamos al método OBTENER_OBJETO, como método estático y con visibilidad Public.
El método que permite un acceso a nuestra clase va a tener un parámetro de retorno con el nombre OBJETO, que es una referencia de la misma clase.
La implementación del método OBTENER_OBJETO
Ejemplo de código de un cliente que utiliza el Singleton
Lo que hemos obtenido con el diseño de patrón Singleton es devolver siempre la misma instancia a todos los clientes.
En este ejemplo lcl_objeto_1 y lcl_objeto_2 están apuntando a la misma instancia de la clase ZCL_SIGLETON