Als Material zum Erlernen von GoF-Entwurfsmustern scheint das Buch "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" hilfreich zu sein. Da die aufgeführten Beispiele jedoch auf JAVA basieren, habe ich dieselbe Vorgehensweise mit Python versucht, um mein Verständnis zu vertiefen.
Das Flyweight-Muster ist eines der von GoF definierten Designmuster. Der Zweck besteht darin, Ressourcen im Programm zu sparen, indem eine Instanz wiederverwendet wird, wenn die entsprechenden Instanzen an verschiedenen Orten verwendet werden.
UML class and sequence diagram UML class diagram (Das Obige wird aus Wikipedia zitiert)
** Fliegengewicht ** steht für "Fliegengewicht", was die leichteste Klasse im Boxen bedeutet, und in diesem Entwurfsmuster soll es für "Blitz" -Objekte sein. Die im "Flyweight" -Muster verwendete Technik besteht darin, "Instanzen so weit wie möglich und nicht nutzlos neu zu teilen". Wenn Sie also eine Instanz benötigen, können Sie die bereits erstellte Instanz verwenden, anstatt sie immer neu zu erstellen. Dann scheint es, dass es geteilt und verwendet wird. Intuitiv denke ich, dass es sich um eine Anwendung von [Entwurfsmuster "Singleton"] handelt (https://qiita.com/ttsubo/items/c4af71ceba15b5b213f8).
Bereiten Sie eine Textdatei vor, in der Zahlen wie Akky Art angezeigt werden.
big0.txt
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
big1.txt
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
big2.txt
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
(Im Folgenden weggelassen)
Ich möchte tatsächlich ein Beispielprogramm ausführen, das das Flyweight-Muster verwendet, und das folgende Verhalten überprüfen.
$ python Main.py 012123
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
....######......
..##......##....
..........##....
......####......
..........##....
..##......##....
....######......
................
Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Flyweight
--Verzeichnisaufbau
.
├── 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
Wenn Sie normal damit umgehen, ist das Programm sehr umfangreich, sodass es sich um eine Rolle handelt, die gemeinsam genutzt werden sollte. Im Beispielprogramm übernimmt die Klasse "BigChar" diese Rolle.
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
Es ist die Rolle der Fabrik, die "Fliegengewicht" macht. Wenn Sie diese Factory verwenden, um eine Flyweight-Rolle zu erstellen, wird die Instanz gemeinsam genutzt. Im Beispielprogramm übernimmt die Klasse "BigCharFactory" diese Rolle.
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
Es ist eine Rolle, "Flyweight" mit der Rolle "FlyweightFactory" zu erstellen und zu verwenden. Im Beispielprogramm übernehmen die Klasse "BigString" und die Methode "startMain" diese Rolle.
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