Patrón de diseño de peso mosca

El patrón Flyweight es uno de los patrones de diseño estructural, ya que este patrón proporciona formas de disminuir el número de objetos, mejorando así la estructura de objetos requerida por la aplicación. El patrón Flyweight se usa cuando necesitamos crear una gran cantidad de objetos similares (por ejemplo, 10 5 ).

¿Por qué nos importa el número de objetos en nuestro programa?

  • Una menor cantidad de objetos reduce el uso de la memoria y logra mantenernos alejados de errores relacionados con la memoria como
  • Aunque crear un objeto en Java es realmente rápido, aún podemos reducir el tiempo de ejecución de nuestro programa compartiendo objetos.

En el patrón Flyweight usamos un HashMap que almacena la referencia al objeto que ya se ha creado, cada objeto está asociado con una clave. Ahora, cuando un cliente quiere crear un objeto, simplemente tiene que pasar una clave asociada con él y, si el objeto ya se ha creado, simplemente obtenemos la referencia a ese objeto; de lo contrario, crea un nuevo objeto y luego lo devuelve como referencia al cliente. .

Estados intrínsecos y extrínsecos

Para entender el estado intrínseco y extrínseco, consideremos un ejemplo.

Supongamos que en un editor de texto cuando ingresamos un carácter, se crea un objeto de la clase Carácter, los atributos de la clase Carácter son {nombre, fuente, tamaño}. No necesitamos crear un objeto cada vez que el cliente ingresa un carácter ya que la letra ‘B’ no es diferente de otra ‘B’. Si el cliente vuelve a escribir una ‘B’, simplemente devolvemos el objeto que ya hemos creado antes. Ahora bien, todos estos son estados intrínsecos (nombre, fuente, tamaño), ya que pueden compartirse entre los diferentes objetos ya que son similares entre sí.

Ahora agregamos más atributos a la clase Carácter, son fila y columna. Especifican la posición de un carácter en el documento. Ahora bien, estos atributos no serán similares incluso para los mismos caracteres, ya que no hay dos caracteres que tengan la misma posición en un documento, estos estados se denominan estados extrínsecos y no se pueden compartir entre objetos.

Implementación: Implementamos la creación de terroristas y contraterroristas en el juego de Counter Strike . Así que tenemos 2 clases, una para T errorist ( T ) y otra para Counter T errorist ( CT ). Cada vez que un jugador pide un arma, le asignamos el arma solicitada. En la misión, la tarea del terrorista es colocar una bomba mientras que los contraterroristas tienen que difundir la bomba.

¿Por qué usar el patrón de diseño Flyweight en este ejemplo? Aquí usamos el patrón de diseño Fly Weight, ya que aquí necesitamos reducir el número de objetos para los jugadores. Ahora tenemos un número n de jugadores jugando CS 1.6, si no seguimos el patrón de diseño Fly Weight, entonces tendremos que crear un número n de objetos, uno para cada jugador. Pero ahora solo tendremos que crear 2 objetos, uno para terroristas y otro para contraterroristas, los reutilizaremos una y otra vez cuando sea necesario.

Estado intrínseco: aquí ‘tarea’ es un estado intrínseco para ambos tipos de jugadores, ya que siempre es el mismo para T’s/CT’s. Podemos tener algunos otros estados como su color o cualquier otra propiedad que sea similar para todos los Terroristas/Contraterroristas en sus respectivas clases de Terroristas/Contraterroristas.

Estado extrínseco: Arma es un estado extrínseco ya que cada jugador puede llevar cualquier arma de su elección. El arma debe pasarse como parámetro por el propio cliente.

Diagrama de clase :FwCd

// A Java program to demonstrate working of
// FlyWeight Pattern with example of Counter
// Strike Game
import java.util.Random;
import java.util.HashMap;
  
// A common interface for all players
interface Player
{
    public void assignWeapon(String weapon);
    public void mission();
}
  
// Terrorist must have weapon and mission
class Terrorist implements Player
{
    // Intrinsic Attribute
    private final String TASK;
  
    // Extrinsic Attribute
    private String weapon;
  
    public Terrorist()
    {
        TASK = "PLANT A BOMB";
    }
    public void assignWeapon(String weapon)
    {
        // Assign a weapon
        this.weapon = weapon;
    }
    public void mission()
    {
        //Work on the Mission
        System.out.println("Terrorist with weapon "
                           + weapon + "|" + " Task is " + TASK);
    }
}
  
// CounterTerrorist must have weapon and mission
class CounterTerrorist implements Player
{
    // Intrinsic Attribute
    private final String TASK;
  
    // Extrinsic Attribute
    private String weapon;
  
    public CounterTerrorist()
    {
        TASK = "DIFFUSE BOMB";
    }
    public void assignWeapon(String weapon)
    {
        this.weapon = weapon;
    }
    public void mission()
    {
        System.out.println("Counter Terrorist with weapon "
                           + weapon + "|" + " Task is " + TASK);
    }
}
  
// Class used to get a player using HashMap (Returns
// an existing player if a player of given type exists.
// Else creates a new player and returns it.
class PlayerFactory
{
    /* HashMap stores the reference to the object
       of Terrorist(TS) or CounterTerrorist(CT).  */
    private static HashMap <String, Player> hm =
                         new HashMap<String, Player>();
  
    // Method to get a player
    public static Player getPlayer(String type)
    {
        Player p = null;
  
        /* If an object for TS or CT has already been
           created simply return its reference */
        if (hm.containsKey(type))
                p = hm.get(type);
        else
        {
            /* create an object of TS/CT  */
            switch(type)
            {
            case "Terrorist":
                System.out.println("Terrorist Created");
                p = new Terrorist();
                break;
            case "CounterTerrorist":
                System.out.println("Counter Terrorist Created");
                p = new CounterTerrorist();
                break;
            default :
                System.out.println("Unreachable code!");
            }
  
            // Once created insert it into the HashMap
            hm.put(type, p);
        }
        return p;
    }
}
  
// Driver class
public class CounterStrike
{
    // All player types and weapon (used by getRandPlayerType()
    // and getRandWeapon()
    private static String[] playerType =
                    {"Terrorist", "CounterTerrorist"};
    private static String[] weapons =
      {"AK-47", "Maverick", "Gut Knife", "Desert Eagle"};
  
  
    // Driver code
    public static void main(String args[])
    {
        /* Assume that we have a total of 10 players
           in the game. */
        for (int i = 0; i < 10; i++)
        {
            /* getPlayer() is called simply using the class
               name since the method is a static one */
            Player p = PlayerFactory.getPlayer(getRandPlayerType());
  
            /* Assign a weapon chosen randomly uniformly
               from the weapon array  */
            p.assignWeapon(getRandWeapon());
  
            // Send this player on a mission
            p.mission();
        }
    }
  
    // Utility methods to get a random player type and
    // weapon
    public static String getRandPlayerType()
    {
        Random r = new Random();
  
        // Will return an integer between [0,2)
        int randInt = r.nextInt(playerType.length);
  
        // return the player stored at index 'randInt'
        return playerType[randInt];
    }
    public static String getRandWeapon()
    {
        Random r = new Random();
  
        // Will return an integer between [0,5)
        int randInt = r.nextInt(weapons.length);
  
        // Return the weapon stored at index 'randInt'
        return weapons[randInt];
    }
}

Producción:

Counter Terrorist Created
Counter Terrorist with weapon Gut Knife| Task is DIFFUSE BOMB
Counter Terrorist with weapon Desert Eagle| Task is DIFFUSE BOMB
Terrorist Created
Terrorist with weapon AK-47| Task is PLANT A BOMB
Terrorist with weapon Gut Knife| Task is PLANT A BOMB
Terrorist with weapon Gut Knife| Task is PLANT A BOMB
Terrorist with weapon Desert Eagle| Task is PLANT A BOMB
Terrorist with weapon AK-47| Task is PLANT A BOMB
Counter Terrorist with weapon Desert Eagle| Task is DIFFUSE BOMB
Counter Terrorist with weapon Gut Knife| Task is DIFFUSE BOMB
Counter Terrorist with weapon Desert Eagle| Task is DIFFUSE BOMB

Lectura adicional: método Flyweight en Python

Referencias:

Este artículo es una contribución de Chirag Agarwal . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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