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

■ Werksmethode

Das Factory-Methodenmuster ist eines der von GoF (Gang of Four) definierten Entwurfsmuster. Das Factory-Methodenmuster zielt darauf ab, die anwendungsspezifische Objekterstellung in Unterklassen zu verschieben und die Wiederverwendbarkeit von Klassen zu erhöhen, indem die Konstruktoren anderer Klassen durch ihre eigenen Methoden ersetzt werden, die von Unterklassen überschrieben werden können. Wird auch als Virtual Constructor-Muster bezeichnet. UML class diagram W3sDesign_Factory_Method_Design_Pattern_UML.jpg 1000px-Factory_Method_UML_class_diagram.svg.png (Das Obige wird aus Wikipedia zitiert)

□ Memorandum

Das Verhaltensmuster Template Method for Behavior ist eine Oberklasse, die die Verarbeitung und Unterklassen beschreibt, die die spezifische Verarbeitung bestimmen. Es scheint, dass das Muster "Factory Method" das Muster "Template Method" auf die Szene beim Erstellen einer Instanz anwendet.

■ Beispielprogramm "Factory Method"

Das Factory-Methodenmuster scheint die folgenden Funktionen zu haben.

Auf diese Weise können das Framework zum Erstellen einer Instanz und die tatsächliche Klasse zum Erstellen einer Instanz separat betrachtet werden. Eigentlich möchte ich das Factory-Methodenmuster verwenden, um ein Beispielprogramm mit dem Thema "Eine Fabrik, die Identifikationskarten (ID-Karten) herstellt" auszuführen und den folgenden Vorgang zu überprüfen.

$ python Main.py 
I'll create Hiroshi Yuki's card
I'll create Tomura's card
I'll create Hanako Sato's card
I'll use Hiroshi Yuki's card
I'll use Tomura's card
I'll use Hanako Sato's card

Wenn Sie nur das Beispielprogramm ausführen, sind Sie sich nicht sicher, was Sie tun möchten. Als nächstes überprüfen wir die Details des Beispielprogramms.

■ Details zum Beispielprogramm

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

--Verzeichnisaufbau

.
├── Main.py
└── framework
    ├── __init__.py
    ├── factory.py
    └── idcardfactory
        ├── __init__.py
        └── id_card_factory.py

(1) Rolle des Produkts

Die Rolle "Produkt" definiert die Schnittstelle, die die Instanz haben soll. Im Beispielprogramm übernimmt die Klasse "Produkt" diese Rolle.

framework/factory.py


from abc import ABCMeta, abstractmethod

... (snip)

class Product(metaclass=ABCMeta):
    @abstractmethod
    def use(self):
        pass

(2) Die Rolle des Schöpfers

In der Rolle des "Schöpfers" ist es für die Erzeugung des "Produkts" verantwortlich. Ich weiß nichts über die Rolle des "konkreten Produkts", die tatsächlich generiert wird. Darüber hinaus bietet die Rolle "Ersteller" Methoden zum Erstellen jedes Teils der Instanz. Im Beispielprogramm übernimmt die Factory-Klasse diese Rolle.

framework/factory.py


from abc import ABCMeta, abstractmethod

class Factory(metaclass=ABCMeta):
    def create(self, owner):
        p = self.createProduct(owner)
        self.registerProduct(p)
        return p

    @abstractmethod
    def createProduct(self, owner):
        pass

    @abstractmethod
    def registerProduct(self, product):
        pass

... (snip)

(3) Rolle des Betonprodukts

Die Rolle "ConcreteProduct" ist eine Klasse, die die Schnittstelle für die Rolle "Product" implementiert. Hier wird die Methode definiert, die nach der eigentlichen Instanziierung aufgerufen wird. Im Beispielprogramm übernimmt die IDCardProduct-Klasse diese Rolle.

framework/id_card_factory.py


from framework.factory import Factory, Product

... (snip)

class IDCardProduct(Product):
    def __init__(self, owner):
        self.owner = owner
        print("I'll create {0}'s card".format(self.owner))

    def use(self):
        print("I'll use {0}'s card".format(self.owner))

(4) Die Rolle des konkreten Schöpfers

Die Rolle "ConcreteCreator" ist eine Klasse, die die Schnittstelle für die Rolle "Creator" implementiert. Bestimmen Sie die Klasse für ein bestimmtes Produkt. Im Beispielprogramm übernimmt die IDCardFactory-Klasse diese Rolle.

framework/id_card_factory.py


from framework.factory import Factory, Product

class IDCardFactory(Factory):
    def __init__(self):
        self.owners = []

    def createProduct(self, owner):
        return IDCardProduct(owner)

    def registerProduct(self, product):
        self.owners.append(product.owner)

... (snip)

(5) Die Rolle des Kunden

Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.

Main.py


from framework.idcardfactory.id_card_factory import IDCardFactory

def startMain(factoryObject):
    card1 = factoryObject.create("Hiroshi Yuki")
    card2 = factoryObject.create("Tomura")
    card3 = factoryObject.create("Hanako Sato")
    card1.use()
    card2.use()
    card3.use()

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

■ Referenz-URL

Recommended Posts

Lernen Sie das Entwurfsmuster "Factory Method" in Python
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
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 "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 "Chain of Responsibility" in Python
Entwurfsmuster #Factory-Methode
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Designmuster "Facade" mit Python
Python Design Pattern - Template-Methode
Implementieren Sie das Singleton-Muster in Python
Singleton-Muster in Python
Besuchermuster in Python
[Viererbande] Designmuster lernen - Fabrikmethode
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Dynamisches Ersetzen der nächsten Methode in Python
Simplex-Methode (Einzelmethode) in Python
Entwurfsmuster # Template-Methode
Private Methode in Python
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Ich habe ein Designmuster in der Kotlin Factory Edition geschrieben
Bestimmen Sie den Schwellenwert mithilfe der P-Tile-Methode in Python
Implementierte k-Neighborhood-Methode in Python von Scikit Learn
Finde Fehler in Python
Entwurfsmuster in Python: Einführung
Muster der Vorlagenmethode in Java
Das Unterdrücken von Methodenüberschreibungen in Python
Verwendung der Methode __call__ in der Python-Klasse
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
Implementierte Methode zur Weitergabe von Etiketten in Python
Simulieren Sie die Monte-Carlo-Methode in Python
Klicken Sie auf die Web-API in Python
Hash-Methode (Open-Address-Methode) 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