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.
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 UML class diagram (Ce qui précède est cité sur Wikipedia)
** 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".
Préparez un fichier texte qui affiche des nombres comme Akky Art.
big0.txt
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
big1.txt
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
big2.txt
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
(Ci-après omis)
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
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
....######......
..##......##....
..........##....
......####......
..........##....
..##......##....
....######......
................
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
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
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
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])
Recommended Posts