Modo de peso mosca "Patrón de diseño"

1. ¿Cuál es el modelo de peso mosca?

El modo Flyweight admite eficazmente la reutilización detallada de objetos con pequeños cambios de estado a través de la tecnología de uso compartido. Cuando hay varios objetos idénticos en el sistema, solo se comparte una copia y no es necesario crear una instancia de un objeto para cada uno, lo que reduce en gran medida el número de objetos en el sistema. Por ejemplo, en un sistema de texto, cada letra define un objeto, luego hay 52 letras mayúsculas y minúsculas en total, por lo que se deben definir 52 objetos. Si hay un texto de 1M, hay tantas letras, si cada letra define un objeto, la memoria se agotará. Entonces, si cada letra comparte un objeto, se ahorrarán mucho recursos.

Antes de comprender el modo de peso mosca, primero debemos comprender dos conceptos: estado interno y estado externo.

  • Estado interno: la parte compartida dentro del objeto flyweight que no cambia con los cambios en el entorno externo.
  • Estado externo: cambia a medida que cambia el entorno, y el estado que no se puede compartir es el estado externo.

Dado que el patrón de peso mosca distingue entre estado interno y estado externo, podemos establecer diferentes estados externos para que el mismo objeto pueda tener algunas características diferentes, mientras que el estado interno se establece en la misma parte. En nuestro proceso de programación, es posible que necesitemos una gran cantidad de objetos detallados para representar objetos. Si estos objetos son iguales excepto por algunos parámetros diferentes, entonces podemos usar el patrón de peso mosca para reducir en gran medida la cantidad de pasos en la aplicación. Objeto. ¿Cómo utilizar el modo peso mosca? Aquí solo necesitamos mover una pequeña cantidad de sus diferentes partes como parámetros al exterior de la instancia de la clase y luego pasarlas cuando se llama al método. Esto también ilustra un punto: el estado interno se almacena dentro del objeto flyweight, mientras que el cliente debe considerar el estado externo.

2. Diagrama de estructura UML

  • (1) Flyweight: clase abstracta de peso mosca, la superclase o interfaz de todas las clases concretas de peso mosca. A través de esta interfaz, Flyweight puede aceptar y actuar sobre temas externos;
  • (2) ConcreteFlyweight: Clase de peso mosca de hormigón. Especifique el estado interno y agregue espacio de almacenamiento para el estado interno.
  • (3) UnsharedConcreteFlyweight: clase de peso mosca de hormigón no compartido. Indica aquellas subclases de Flyweight que no necesitan compartirse.
  • (4) FlyweightFactory: clase de fábrica Flyweight, que se utiliza para crear y administrar objetos Flyweight y se utiliza principalmente para garantizar un intercambio razonable de Flyweight.

El núcleo del modelo flyweight es la clase de fábrica flyweight. La clase de fábrica flyweight mantiene un grupo de almacenamiento de objetos. Cuando el cliente necesita un objeto, primero lo obtiene del grupo flyweight. Si hay una instancia de objeto en el grupo flyweight, se devolverá directamente. Si no existe en el grupo de peso mosca, se crea una nueva instancia de objeto de peso mosca y se devuelve al usuario, y el nuevo objeto se guarda en el grupo de peso mosca. Esto tiene el significado de un singleton.

Las clases de fábrica generalmente usan tipos de colección para guardar objetos, como HashMap, Hashtable, Vector, etc. En Java, los grupos de conexiones de bases de datos, grupos de subprocesos, etc. son aplicaciones que usan el modo Flyweight.

public class FlyweightFactory{
    private HashMap flyweights = new HashMap();
    
    public Flyweight getFlyweight(String key){
        if(flyweights.containsKey(key)){
            return (Flyweight)flyweights.get(key);
        }
        else{
            Flyweight fw = new ConcreteFlyweight();
            flyweights.put(key,fw);
            return fw;
        }
    }
}

3. Implementación del código

Escenario: si tenemos una aplicación de dibujo a través de la cual podemos dibujar gráficos de varias formas y colores, entonces la forma y el color aquí son estados internos. A través del modo peso mosca podemos lograr compartir este atributo. como sigue:

Primero está la clase de forma: Shape.java. Es una clase abstracta con un solo método abstracto para dibujar gráficos.

public abstract class Shape {
    public abstract void draw();
}

Luego está la clase concreta para dibujar círculos. Círculo.java:

public class Circle extends Shape{
    private String color;
    public Circle(String color){
        this.color = color;
    }
 
    public void draw() {
        System.out.println("画了一个" + color +"的圆形");
    }
}

Luego está la clase de fábrica de peso mosca. Fábrica de peso mosca:

//核心类
public class FlyweightFactory{
    static Map<String, Shape> shapes = new HashMap<String, Shape>();
    
    public static Shape getShape(String key){
        Shape shape = shapes.get(key);
        //如果shape==null,表示不存在,则新建,并且保持到共享池中
        if(shape == null){
            shape = new Circle(key);
            shapes.put(key, shape);
        }
        return shape;
    }
    
    public static int getSum(){
        return shapes.size();
    }
}

Aquí se define un HashMap para almacenar cada objeto. Cuando el usuario necesita un objeto, primero lo obtiene del grupo de peso mosca. Si no existe en el grupo de peso mosca, se crea un nuevo objeto peso mosca y se devuelve al usuario, y se almacenado en el grupo de peso mosca. Guarde el nuevo objeto en formato .

Finalmente, el programa cliente: Client.java:

public class Client {
    public static void main(String[] args) {
        Shape shape1 = FlyweightFactory.getShape("红色");
        shape1.draw();
        
        Shape shape2 = FlyweightFactory.getShape("灰色");
        shape2.draw();
        
        Shape shape3 = FlyweightFactory.getShape("绿色");
        shape3.draw();
        
        Shape shape4 = FlyweightFactory.getShape("红色");
        shape4.draw();
        
        Shape shape5 = FlyweightFactory.getShape("灰色");
        shape5.draw();
        
        Shape shape6 = FlyweightFactory.getShape("灰色");
        shape6.draw();
        
        System.out.println("一共绘制了"+FlyweightFactory.getSum()+"中颜色的圆形");
    }
}

resultado de la operación:

En Java, el tipo String usa el patrón flyweight . El objeto String es un tipo final y no se puede cambiar una vez que se crea el objeto. Las constantes de cadena de Java se almacenan en el grupo de constantes de cadena y la JVM se asegurará de que solo haya una copia de una constante de cadena en el grupo de constantes. 

Cadena a="abc", donde "abc" es una constante de cadena. Quienes estén familiarizados con Java deberían conocer el siguiente ejemplo:

String a = "hello";
String b = "hello";
if(a == b)
 System.out.println("OK");
else
 System.out.println("Error");

El resultado es: OK. Se puede ver que la condición if compara las direcciones de dos ayb, que también se puede decir que es el espacio de memoria.

4. Ventajas y desventajas del modelo Flyweight

4.1 Ventajas del modo mosca:

(1) Reducir en gran medida la cantidad de objetos en el sistema;

(2) Dado que se utiliza el estado externo, el estado externo es relativamente independiente y no afectará el estado interno, por lo que el modo flyweight permite compartir objetos flyweight en diferentes entornos.

4.2 Desventajas del modo mosca:

(1) Dado que el patrón de peso mosca necesita distinguir entre el estado externo y el estado interno, la aplicación se vuelve hasta cierto punto más complicada.

(2) Para que el objeto se pueda compartir, el estado del objeto flyweight debe externalizarse y leer el estado externo prolonga el tiempo de ejecución.

4.3 Escenarios aplicables:

(1) Si hay una gran cantidad de objetos idénticos o similares en el sistema, el gran uso de dichos objetos provocará un consumo de memoria del sistema. Puede utilizar el modo de peso mosca para reducir la cantidad de objetos en el sistema.

(2) La mayor parte del estado del objeto se puede externalizar y estos estados externos se pueden pasar al objeto.

Artículo de referencia:  Tipo estructural de patrón de diseño de Java: patrón de peso mosca_blog-CSDN de Zhang Weipeng

Supongo que te gusta

Origin blog.csdn.net/m0_50370837/article/details/126305428
Recomendado
Clasificación