Flyweight – Patrones de Diseño
Antonio Leiva

El patrón de diseño Flyweight es un patrón de diseño estructural que se utiliza para optimizar la utilización de memoria en una aplicación. Este patrón se basa en la idea de compartir objetos que se repiten en una aplicación, en lugar de crear una nueva instancia de cada uno de ellos.

Este patrón se aplica en situaciones donde una aplicación necesita manejar un gran número de objetos similares, como por ejemplo en un juego donde se necesitan dibujar muchos enemigos en pantalla. En lugar de crear una nueva instancia de cada enemigo, el patrón Flyweight permite compartir una única instancia entre todos los enemigos del mismo tipo.

En Kotlin, se puede implementar el patrón Flyweight utilizando una interfaz y una clase concreta que implemente esa interfaz. La interfaz se utiliza para definir los métodos comunes que tendrán todas las instancias del objeto compartido, mientras que la clase concreta se encarga de implementar esos métodos.

Por ejemplo, supongamos que queremos crear una aplicación que dibuje enemigos en pantalla. Podemos utilizar el patrón Flyweight para compartir una única instancia de cada tipo de enemigo. La interfaz podría definirse de la siguiente manera:

interface Enemy {
    fun draw(x: Int, y: Int)
}

La clase concreta que implemente esta interfaz sería la encargada de dibujar el enemigo en pantalla en la posición indicada. Por ejemplo, una clase que dibuje un enemigo rojo podría definirse de la siguiente manera:

class RedEnemy : Enemy {
    override fun draw(x: Int, y: Int) {
        // Dibujar enemigo rojo en la posición (x, y)
    }
}

Una vez que tenemos la interfaz y la clase concreta que implementa esa interfaz, podemos utilizar el patrón Flyweight para compartir una única instancia de cada tipo de enemigo.

Esto se puede hacer utilizando una clase que se encargue de almacenar las instancias compartidas y devolverlas cuando sean necesarias.

Esta clase se conoce como «factoría» y puede definirse de la siguiente manera:

class EnemyFactory {
    private val enemies = mutableMapOf<String, Enemy>()

    fun getEnemy(type: String): Enemy {
        if (enemies.containsKey(type)) {
            return enemies[type]!!
        } else {
            val enemy = when (type) {
                "red" -> RedEnemy()
                "blue" -> BlueEnemy()
                // etc.
                else -> throw IllegalArgumentException("Invalid enemy type")
            }
            enemies[type] = enemy
            return enemy
        }
    }
}

Esta clase almacena las instancias compartidas en un mapa, utilizando como clave el tipo de enemigo.

Cuando se solicita un enemigo, la clase verifica si ya existe una instancia compartida del tipo solicitado y, en caso contrario, crea una nueva instancia y la almacena en el mapa.

Para utilizar esta clase, basta con crear una instancia de la misma y utilizar el método getEnemy() para obtener un enemigo. Por ejemplo:

val factory = EnemyFactory()
val redEnemy = factory.getEnemy("red")
redEnemy.draw(10, 20)

De esta manera, se utiliza el patrón Flyweight para compartir una única instancia del enemigo rojo entre todos los lugares de la aplicación que lo necesiten. Esto permite reducir el uso de memoria, ya que sólo se crea una única instancia del enemigo rojo, en lugar de crear una nueva instancia en cada lugar que se utilice.

En resumen, el patrón de diseño Flyweight es un patrón de diseño estructural que se utiliza para optimizar el uso de memoria en una aplicación.

Este patrón se basa en la idea de compartir objetos que se repiten en una aplicación, en lugar de crear una nueva instancia de cada uno de ellos.

En Kotlin, se puede implementar el patrón Flyweight utilizando una interfaz y una clase concreta que implemente esa interfaz, y una clase «factoría» que se encargue de almacenar y devolver las instancias compartidas.

Quizá también te interese…

Las reglas FIRST de los tests

Las reglas FIRST de los tests

Las reglas FIRST son un conjunto de principios que se utilizan para diseñar y escribir tests de software de manera efectiva. Las siglas FIRST significan: F - Fast: Un test debe ser rápido de ejecutar. I - Independent: Un test debe ser independiente de otros tests y...

¿Qué son los dobles de test?

¿Qué son los dobles de test?

Los dobles de prueba (también conocidos como "doubles" o "fakes") son herramientas comunes en la programación y en particular en el testing de software. Se utilizan para simular el comportamiento de una dependencia de una aplicación en un entorno de pruebas, sin tener...

Kata del TicTacToe en Kotlin

Kata del TicTacToe en Kotlin

Escribe el código para representar una entidad que almacene el tablero de juego del 3 en raya, y que además tenga: Un método move() con 2 parámetros, fila y columna, que permita añadir un movimiento al tablero Un método findWinner(), que devuelva el ganador (X, Y o...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *