[JAVA] Introduction aux modèles de conception (poids mouche)

Cet article résume Flyweight. Selon wikipedia, «Lorsque vous utilisez des instances équivalentes à différents endroits, vous pouvez économiser des ressources en réutilisant une instance». Référence: Flyweight pattern

** Personnages principaux **

NO Nom rôle
1 Classe de poids mouche La classe que vous souhaitez instancier
2 Classe FlyweightFactory Conserver l'état de la classe instanciée

Si vous souhaitez représenter une forêt par programme, vous générerez probablement un grand nombre d'instances d'arborescence. La génération d'une grande quantité consomme de la mémoire sur le serveur, mais c'est un modèle qui économise de la mémoire en réduisant le nombre d'instances à l'exécution. En Java, il y avait une méthode appelée String.intern comme plan de réglage pour l'économie de mémoire, mais je pense que l'idée (réutiliser des objets avec le même contenu) est presque la même.

** Implémentez le modèle ** Le but est simple et de réduire l'instanciation (nouveau dans le code source). Je vais l'implémenter avec l'exemple de wikipedia. Une certaine chaîne de caractères est définie caractère par caractère dans le type char, et si elle est déjà définie, elle sera réutilisée, et si elle n'est pas définie, elle sera générée.

** Classe poids mouche **

Stamp.java


class Stamp {
    char type;
    Stamp(char type){
        this.type = type;
    }
    void print(){
        System.out.print(this.type);
    }
}

** Classe FlyweightFactory **

StampFactory.java


import java.util.Map;
import java.util.HashMap;

class StampFactory {
    Map<Character, Stamp> pool;
    StampFactory(){
        this.pool = new HashMap<Character, Stamp>();
    }
    Stamp get(char type){
        Stamp stamp = this.pool.get(type);
        if(stamp == null) {
            stamp = new Stamp(type);
            this.pool.put(type, stamp);
        }
        return stamp;
    }
}

** Classe d'exécution **

FlyweightTest.java


import java.util.Map;
import java.util.List;
import java.util.ArrayList;

class FlyweightTest {
    public static void main(String[] args) {
        StampFactory factory = new StampFactory();
        List<Stamp> stamps = new ArrayList<Stamp>();
        stamps.add(factory.get('Ta'));
        stamps.add(factory.get('Ou'));
        stamps.add(factory.get('je'));
        stamps.add(factory.get('Ta'));
        stamps.add(factory.get('Ke'));
        stamps.add(factory.get('Ta'));
        stamps.add(factory.get('main'));
        stamps.add(factory.get('Ou'));
        stamps.add(factory.get('Ke'));
        stamps.add(factory.get('Ta'));
        for(Stamp s : stamps){
            s.print();
        }
    }
}

résultat


j'étais coincé

Si vous mettez dans un processus réutilisable qui réduit autant que possible l'utilisation de la mémoire, cela peut entraîner des rides dans la surcharge et les performances globales, vous devez donc identifier les points de chacun. Cependant, dans le cas du langage Java, afin de créer un objet, 2 octets sont consommés pour les caractères (type char) et 4 octets pour les entiers (type int). Si c'est un environnement auquel on accède en parallèle, même s'il est temporaire, l'utilisation augmentera plusieurs fois, donc je pense que c'est un événement (modèle) dont vous devriez être conscient.

Recommended Posts

Introduction aux modèles de conception (poids mouche)
Introduction aux modèles de conception (Builder)
Introduction aux modèles de conception (composite)
Introduction au prototype de modèles de conception
Introduction aux modèles de conception (Iterator)
Introduction aux modèles de conception (stratégie)
Introduction aux modèles de conception (méthode d'usine)
Introduction aux modèles de conception (Abstract Factory)
Modèle de conception important pour améliorer la maintenabilité
Introduction à Ruby 2
Divers modèles de conception
Modèles de conception Java
Introduction à web3j
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Introduction à Java
Introduction à Doma
Modèle de conception ~ Poids mouche ~
Introduction aux fichiers JAR
Introduction à Ratpack (8) - Session
Introduction à l'arithmétique des bits
Introduction à Ratpack (6) - Promesse
Introduction à PlayFramework 2.7 ① Présentation
Introduction à la mise en page Android
Introduction à la programmation pratique
Introduction à la commande javadoc
Introduction à la commande jar
Introduction à Ratpack (2) -Architecture
Introduction au style lambda
Introduction à la commande java
Introduction au développement de Keycloak
Étudier les modèles de conception du GoF
Introduction à la commande javac
J'ai lu Hiroshi Yuki "Introduction aux modèles de conception appris en langage Java" (SB Creative)
Introduction au développement d'applications Android
Introduction à la métabase ~ Construction de l'environnement ~
Introduction à Ratpack (7) --Guice & Spring
(Installation par points) Introduction à Java8_Impression
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à JUnit (note d'étude)
Introduction à Spring Boot ① ~ DI ~
[Java] Introduction à l'expression lambda
Introduction à Spring Boot ② ~ AOP ~
Introduction à Apache Beam (2) ~ ParDo ~
Introduction à l'API EHRbase 2-REST
[Java] Introduction à l'API Stream
Introduction à Spring Boot, partie 1
Introduction à Ratpack (1) - Qu'est-ce que Ratpack?
Pourquoi vous avez besoin d'un modèle de conception
[Java] Résumé des modèles de conception