[GO] Lernen Sie das Entwurfsmuster "Prototype" mit 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.

■ Prototyp (Prototypmuster)

Das Prototypmuster (Prototypmuster) ist eines der Entwurfsmuster, die sich auf die in der Softwareentwicklung verwendete Generierung beziehen. Wird verwendet, wenn der erstellte Objekttyp eine (typische) Prototypinstanz ist, wobei dieser Prototyp dupliziert wird, um ein neues Objekt zu erstellen.

Dieses Muster wird für die folgenden Zwecke verwendet.

Um dieses Muster zu implementieren, deklarieren Sie eine abstrakte Basisklasse, die die reine virtuelle Methode clone () angibt. Alle Klassen, die die Fähigkeit "polymorpher Konstruktoren" erfordern, leiten sich von abstrakten Basisklassen ab und implementieren clone () -Operationen.

UML class and sequence diagram W3sDesign_Prototype_Design_Pattern_UML.jpg UML class diagram https---qiita-image-store.s3.ap-northeast-1.amazonaws.com-0-103595-3c90ab89-e715-587d-10eb-65490cb5be6c.png

(Das Obige wird aus Wikipedia zitiert)

□ Memorandum

Das "Prototyp" -Muster besteht darin, eine andere Instanz aus einer Instanz zu erstellen, indem die Instanz kopiert wird, anstatt eine Instanz aus der Klasse zu erstellen. Die Vorteile der Verwendung des Prototypmusters werden auf Seite 66 des Buches "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" beschrieben. (1) Wenn es zu viele Typen gibt, um sie in einer Klasse zusammenzustellen (2) Wenn es schwierig ist, eine Instanz aus einer Klasse zu erstellen (3) Wenn Sie das Framework und die generierte Instanz trennen möchten

Wenn es Anwendungsfälle gibt, die eine große Anzahl von Instanzen generieren, führt dies zu einer Reduzierung der Overhead-Verarbeitung im Zusammenhang mit der Instanzerstellung?

■ Beispielprogramm "Prototyp"

Eigentlich möchte ich ein Beispielprogramm ausführen, das das Prototypmuster verwendet, und das folgende Verhalten überprüfen.

$ python Main.py 
"Hello World"
-------------

***************
* Hello World *
***************

///////////////
/ Hello World /
///////////////

■ Details zum Beispielprogramm

Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Prototype

--Verzeichnisaufbau

.
├── Main.py
└── framework
    ├── __init__.py
    ├── decoprototype
    │   ├── __init__.py
    │   ├── message_box_prototype.py
    │   └── underline_pen_prototype.py
    ├── manager.py
    └── prototype.py

(1) Die Rolle des Prototyps

Die Rolle "Prototyp" definiert die Schnittstelle zum Kopieren (Duplizieren) einer Instanz, um eine neue Instanz zu erstellen. Im Beispielprogramm übernimmt die Klasse "Prototype" diese Rolle.

framework/prototype.py


from abc import ABCMeta, abstractmethod

class Prototype(metaclass=ABCMeta):
    @abstractmethod
    def use(self, s):
        pass

    @abstractmethod
    def createClone(self):
        pass

(2) Die Rolle des konkreten Prototyps

Die Rolle "ConcretePrototype" implementiert tatsächlich die Methode zum Kopieren einer Instanz und zum Erstellen einer neuen. Im Beispielprogramm übernehmen die Klassen "UnderlinePen" und "MessageBox" diese Rolle.

framework/decoprototype/underline_pen_prototype.py


import copy
from framework.prototype import Prototype

class UnderlinePen(Prototype):
    def __init__(self, ulchar):
        self.__ulchar = ulchar

    def use(self, s):
        length = len(s)
        line = self.__ulchar * (length + 2)

        print("\"{0}\"".format(s))
        print("{0}\n".format(line))

    def createClone(self):
        clone = copy.deepcopy(self)
        return clone

framework/decoprototype/message_box_prototype.py


import copy
from framework.prototype import Prototype

class MessageBox(Prototype):
    def __init__(self, decochar):
        self.__decochar = decochar

    def use(self, s):
        length = len(s)
        line = self.__decochar * (length + 4)

        print("{0}".format(line))
        print("{0} {1} {2}".format(self.__decochar, s, self.__decochar))
        print("{0}\n".format(line))

    def createClone(self):
        clone = copy.deepcopy(self)
        return clone

(3) Die Rolle des Kunden (Benutzers)

Die Rolle "Client" erstellt eine neue Instanz mit der Methode, mit der die Instanz kopiert wird. Im Beispielprogramm übernehmen die Klasse "Manager" und die Methode "startMain" diese Rolle.

framework/manager.py


class Manager(object):
    def __init__(self):
        self.__showcase = {}

    def register(self, name, proto):
        self.__showcase[name] = proto

    def create(self, protoname):
        p = self.__showcase[protoname]
        return p.createClone()

Main.py


from framework.manager import Manager
from framework.decoprototype.underline_pen_prototype import UnderlinePen
from framework.decoprototype.message_box_prototype import MessageBox

def startMain(managerObject):
    upen = UnderlinePen("-")
    mbox = MessageBox("*")
    sbox = MessageBox("/")
    managerObject.register("strong message", upen)
    managerObject.register("warning box", mbox)
    managerObject.register("slash box", sbox)

    p1 = managerObject.create("strong message")
    p2 = managerObject.create("warning box")
    p3 = managerObject.create("slash box")
    p1.use("Hello World")
    p2.use("Hello World")
    p3.use("Hello World")

if __name__ == "__main__":
    startMain(Manager())

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
Lernen Sie das Designmuster "Flyweight" in 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
Singleton-Muster in Python
Besuchermuster in Python
Prototypmuster in Java
Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben
Finde Fehler in Python
Entwurfsmuster in Python: Einführung
Python Design Pattern - Template-Methode
Abrufen der arXiv-API in Python
Python im Browser: Brythons Empfehlung
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
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)
GoF-Entwurfsmuster aus dem Problem 2. Struktur
Zeigen Sie Python 3 im Browser mit MAMP an