Apprenez le modèle de conception "Flyweight" en Python

En tant que matériel d'apprentissage des modèles de conception du GoF, le livre «Introduction aux modèles de conception appris dans le langage Java augmenté et révisé» semble être utile. Cependant, comme les exemples repris sont basés sur JAVA, j'ai essayé la même pratique avec Python pour approfondir ma compréhension.

■ Poids mouche (modèle poids mouche)

Le modèle Flyweight est l'un des modèles de conception définis par le GoF. Le but est d'économiser des ressources dans le programme en réutilisant une instance lorsque les instances équivalentes sont utilisées à différents endroits.

UML class and sequence diagram W3sDesign_Flyweight_Design_Pattern_UML.jpg UML class diagram flyweight.png (Ce qui précède est cité sur Wikipedia)

□ Mémorandum

** flyweight ** signifie "fly weight", ce qui signifie la classe la plus légère de la boxe, et dans ce modèle de conception, on dit qu'il s'agit d'objets "éclaircissants". La technique utilisée dans le modèle Flyweight est de" partager des instances autant que possible et pas inutilement nouvelles ", donc lorsque vous avez besoin d'une instance, vous pouvez utiliser l'instance déjà créée au lieu de toujours la renouveler. Ensuite, il semble qu'il soit partagé et utilisé. Intuitivement, je pense que c'est une application de modèle de conception "Singleton".

■ Exemple de programme "Flyweight"

(1) Préparation préalable

Préparez un fichier texte qui affiche des nombres comme Akky Art.

big0.txt


....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................

big1.txt


......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................

big2.txt


....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................

(Ci-après omis)

(2) Contrôle de fonctionnement

Je voudrais exécuter un exemple de programme qui utilise le modèle Flyweight et vérifier le comportement suivant.

--Affiche les nombres spécifiés dans l'art ASCII dans l'ordre des nombres d'argument

$ python Main.py 012123
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
....######......
..##......##....
..........##....
......####......
..........##....
..##......##....
....######......
................

■ Détails de l'exemple de programme

Un code similaire a été téléchargé dans le référentiel Git. https://github.com/ttsubo/study_of_design_pattern/tree/master/Flyweight

.
├── Main.py
├── big0.txt
├── big1.txt
├── big2.txt
├── big3.txt
├── big4.txt
├── big5.txt
├── big6.txt
├── big7.txt
├── big8.txt
├── big9.txt
└── flyweight
    ├── __init__.py
    └── big_char_factory.py

(1) Le rôle de Flyweight

Si vous le gérez normalement, le programme sera lourd, c'est donc un rôle qui représente quelque chose qui devrait être partagé. Dans l'exemple de programme, la classe BigChar remplit ce rôle.

flyweight/big_char_factory.py


class BigChar(object):
    def __init__(self, charname):
        try:
            with open("big{0}.txt".format(charname), 'r') as txtfile:
                data = txtfile.read()
            self.__fontdata = data
        except IOError:
            self.__fontdata = charname + '?'

    def __str__(self):
        return self.__fontdata

(2) Le rôle de Flyweight Factory

C'est le rôle de l'usine qui fabrique "Flyweight". Si vous utilisez cette fabrique pour créer un rôle Flyweight, l'instance sera partagée. Dans l'exemple de programme, la classe BigCharFactory remplit ce rôle.

flyweight/big_char_factory.py


class BigCharFactory(object):
    def __init__(self):
        self.__pool = {}

    @classmethod
    def getInstance(cls):
        if not hasattr(cls, "_instance"):
            cls._instance = cls()
        return cls._instance

    def getBigChar(self, charname):
        bc = self.__pool.get(charname)
        if bc is None:
            bc = BigChar(charname)
            self.__pool[charname] = bc
        return bc

(3) Le rôle du client

C'est un rôle de créer «Flyweight» en utilisant le rôle de «FlyweightFactory» et de l'utiliser. Dans l'exemple de programme, la classe BigString et la méthode startMain remplissent ce rôle.

flyweight/big_char_factory.py


class BigString(object):
    def __init__(self, string):
        self.bigchars = []
        self.factory = BigCharFactory.getInstance()
        for s in string:
            self.bigchars.append(self.factory.getBigChar(s))

    def print(self):
        for bc in self.bigchars:
            print(bc)

Main.py


import sys
from flyweight.big_char_factory import BigCharFactory, BigString

def startMain(string):
    bs = BigString(string)
    bs.print()

if __name__ == '__main__':
    startMain(sys.argv[1])

■ URL de référence

Recommended Posts

Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Apprenez le modèle de conception "Commande" en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Apprenez le modèle de conception "Iterator" avec Python
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
Apprenez le modèle de conception "Adapter" avec Python
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
Apprenez le modèle de conception "Méthode d'usine" en Python
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Apprenez le modèle de conception "Singleton" avec Python
Apprenez le modèle de conception "Façade" avec Python
Implémenter le modèle Singleton en Python
Modèle de poids mouche en Java
Motif singleton en Python
Modèle de visiteur en Python
Trouver des erreurs en Python
Modèles de conception en Python: introduction
Python Design Pattern - Méthode de modèle
Obtenir l'API arXiv en Python
Changez le modèle Flyweight en Pythonic (?) (3)
Python dans le navigateur: la recommandation de Brython
Changez le modèle Flyweight en Pythonic (?) (2)
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Accédez à l'API Web en Python
Changez le modèle Flyweight en Pythonic (?) (1)
J'ai écrit la file d'attente en Python
Calculer le mois précédent en Python
Examiner la classe d'un objet avec python
Obtenez le chemin du bureau en Python
Obtenez le nom d'hôte en Python
Accéder à l'API Twitter avec Python
La première étape de Python Matplotlib
J'ai écrit la pile en Python
Maîtriser le module lowref en Python
Apprenez les bases de Python ① Débutants élémentaires
Charger le SDK Python distant avec IntelliJ
Essayez d'utiliser l'API Wunderlist en Python
Vérifiez le comportement du destroyer en Python
[Python Kivy] À propos de la modification du thème de conception
Essayez d'utiliser l'API Kraken avec Python
Apprenez les bases en touchant les variables python
Ecrire le test dans la docstring python
Prenez la somme logique de List en Python (fonction zip)