[GO] Lernen Sie das Designmuster "Flyweight" in Python

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.

■ Fliegengewicht (Fliegengewichtsmuster)

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 W3sDesign_Flyweight_Design_Pattern_UML.jpg UML class diagram flyweight.png (Das Obige wird aus Wikipedia zitiert)

□ Memorandum

** 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).

■ Beispielprogramm "Fliegengewicht"

(1) Vorbereitungen

Bereiten Sie eine Textdatei vor, in der Zahlen wie Akky Art angezeigt werden.

big0.txt


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

big1.txt


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

big2.txt


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

(Im Folgenden weggelassen)

(2) Funktionsprüfung

Ich möchte tatsächlich ein Beispielprogramm ausführen, das das Flyweight-Muster verwendet, und das folgende Verhalten überprüfen.

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

■ Details zum Beispielprogramm

Ä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

(1) Die Rolle des Fliegengewichts

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

(2) Die Rolle der Fliegengewichtsfabrik

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

(3) Die Rolle des Kunden

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])

■ Referenz-URL

Recommended Posts

Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Befehl" in Python
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Lernen Sie das Entwurfsmuster "Iterator" mit Python
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Designmuster "Facade" mit Python
Implementieren Sie das Singleton-Muster in Python
Fliegengewichtsmuster in Java
Singleton-Muster in Python
Besuchermuster in Python
Finde Fehler in Python
Entwurfsmuster in Python: Einführung
Python Design Pattern - Template-Methode
Abrufen der arXiv-API in Python
Ändere das Fliegengewichtsmuster in Pythonic (?) (3)
Python im Browser: Brythons Empfehlung
Ändere das Fliegengewichtsmuster in Pythonic (?) (2)
Speichern Sie die Binärdatei in Python
Klicken Sie in Python auf die Sesami-API
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Skriptpfad in Python
Im Python-Befehl zeigt Python auf Python3.8
Klicken Sie auf die Web-API in Python
Ändere das Fliegengewichtsmuster in Pythonic (?) (1)
Ich habe die Warteschlange in Python geschrieben
Berechnen Sie den Vormonat in Python
Untersuchen Sie die Klasse eines Objekts mit Python
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Hostnamen in Python
Greifen Sie mit Python auf die Twitter-API zu
Der erste Schritt von Python Matplotlib
Ich habe den Stack in Python geschrieben
Beherrsche das schwache Ref-Modul in Python
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Laden Sie das Remote-Python-SDK mit IntelliJ
Versuchen Sie es mit der Wunderlist-API in Python
Überprüfen Sie das Verhalten des Zerstörers in Python
[Python Kivy] Über das Ändern des Designthemas
Versuchen Sie, die Kraken-API mit Python zu verwenden
Lernen Sie die Grundlagen, während Sie Python-Variablen berühren
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Nehmen Sie die logische Summe von List in Python (Zip-Funktion)