[PYTHON] Entwurfsmuster #Factory-Methode

Ich habe Designmuster geübt, um Code zu schreiben, der sich des Designs bewusst war. Andere Entwurfsmuster werden häufig veröffentlicht.

Vorwort

Das Hauptziel ist zu verstehen, wann, was und wie Entwurfsmuster verwendet werden. (Ich bin neu in Java oder einer statisch typisierten Sprache und habe keine lange Geschichte mit Python. Ich denke, es gibt einige Dinge, die Pythonista nicht ähneln. Wenn Sie Vorschläge haben, bringen Sie mir dies bitte bei.)

Diesmal das Muster FactoryMethod zur Generierung.

Was ist die Fabrikmethode?

Trennen Sie die Objekterstellungsschnittstelle und die Rolle der Objekterstellung, ersetzen Sie die Konstruktoren anderer Klassen durch Ihre eigenen Methoden, die von Unterklassen überschrieben werden können, und überlassen Sie die Objekterstellung Unterklassen, um die Wiederverwendbarkeit von Klassen zu verbessern.

Überblick

Dieses Beispielprogramm basiert auf einer Fabrik, die Identifikationskarten (ID-Karten) herstellt. Hier gibt es vier Klassen.

Die Klassen Product und Factory gehören zu einem Paket namens Framework. Diese beiden Klassen dienen als Rahmen für die Instanziierung.

Die ID-Klasse und die IDCardFactory-Klasse übernehmen das eigentliche Fleisch. Diese gehören zu einem Paket namens ID Card.

Gesamtklassendiagramm

Framework/factory.py


from abc import ABCMeta, abstractmethod


class Factory(metaclass=ABCMeta):

    @abstractmethod
    def _create_product(self, owner):
        pass

    @abstractmethod
    def _register_product(self, product):
        pass

    def create(self, owner):
        self.__p = self._create_product(owner)
        self._register_product(self.__p)
        return self.__p

Hier wird das Muster der Vorlagenmethode verwendet. Das Muster der Vorlagenmethode besteht darin, "einen großen Verarbeitungsrahmen in der Oberklasse zu bestimmen und die spezifische Verarbeitung in der Unterklasse zu bestimmen".

Diese Klasse definiert ein großes Framework für die Verarbeitung, und Unterklassen sind für die Implementierung der Methoden create_product und register_product verantwortlich, für die keine spezifische Verarbeitung festgelegt wurde.

Die Methode create verwendet sowohl die Methoden create_product als auch register_product, um eine Instanz des "Produkts" zu erstellen. Das Factory-Methodenmuster verwendet das Template-Methodenmuster zur Instanziierung.

Framework/product.py


from abc import ABCMeta, abstractmethod

class Product(metaclass=ABCMeta):

    @abstractmethod
    def use(self):
        pass

Nur die Deklaration der abstrakten Methode wird verwendet.

IDCard/idcard.py


from Framework.product import Product


class IDCard(Product):

    def __init__(self, owner):
        self.__owner = owner
        print(self.__owner + 'Erstellen Sie eine Karte für')

    def use(self):
        print(self.__owner + 'Verwenden Sie die Karte')

    def get_owner(self):
        return self.__owner

Definieren Sie als Unterklasse der Produktklasse, erstellen Sie einen Konstruktor und definieren Sie die Verwendungsmethode und die Methode get_owner.

IDCard/idcard_factory.py


from Framework.factory import Factory
from IDCard.idcard import IDCard


class IDCardFactory(Factory):

    def __init__(self):
        self.__registed = []

    def _create_product(self, owner):
        return IDCard(owner)

    def _register_product(self, product):
        self.__registed.append(product.get_owner())

Implementierte Methoden create_product und register_product. Die Methode create_product erstellt eine Instanz der IDCard-Klasse. Die Methode register_product fügt den IDCard-Besitzer, den die Methode get_owner erhalten hat, zu den Listenbesitzern hinzu.

main.py


from IDCard.idcard_factory import IDCardFactory


def main():
    factory = IDCardFactory()
    card1 = factory.create('Hiroshi Yuki')
    card2 = factory.create('Tomura')
    card3 = factory.create('Hanako Sato')

    card1.use()
    card2.use()
    card3.use()

if __name__ == '__main__':
    main()

Ausgabeergebnis

Erstelle eine Karte für Hiroshi Yuki
Erstellen Sie eine Tomura-Karte
Erstellen Sie eine Karte für Hanako Sato
Ich werde die Karte von Hiroshi Yuki verwenden
Ich werde Tomuras Karte benutzen
Ich werde Hanako Satos Karte benutzen

Zusammenfassung

Da nur die Schnittstelle angegeben wird und die Unterklasse entscheiden kann, welche Klasse instanziiert werden soll, konnte von außen auf die Methode zugegriffen werden, ohne sich um die interne Implementierung kümmern zu müssen.

Referenz

Recommended Posts

Entwurfsmuster #Factory-Methode
Entwurfsmuster # Template-Methode
[Viererbande] Designmuster lernen - Fabrikmethode
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Python Design Pattern - Template-Methode
Entwurfsmuster #Builder
Entwurfsmuster #Adapter
Entwurfsmuster #Decorator
Entwurfsmuster #Observer
Entwurfsmuster #Facade
Entwurfsmuster #Strategie
Entwurfsmuster #Singleton
Entwurfsmuster #Proxy
[Viererbande] Designmusterlernen - Abstract Factory
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
[Detaillierte Erklärung] Muster der Vorlagenmethode
[Viererbande] Design Pattern Learning - Template-Methode
Ich habe ein Designmuster in der Kotlin Factory Edition geschrieben
Muster der Vorlagenmethode in Java
Oreore-Entwurfsmuster: Glokale Variable
[Viererbande] Designmuster lernen
Einführung einer datengesteuerten Controller-Entwurfsmethode
Grobe Zusammenfassung des GoF-Java-Entwurfsmusters
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
[Viererbande] Design Pattern Learning - Singleton
[Viererbande] Design Pattern Learning --Decorator
[Viererbande] Designmuster lernen --Besucher
[Viererbande] Design Pattern Learning - Vermittler
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
[Viererbande] Designmusterlernen --Iterator
GoF-Entwurfsmuster aus dem Problem 2. Struktur
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
[Viererbande] Designmuster lernen - Fassade
[Viererbande] Design Pattern Learning - Composite
[Viererbande] Designmuster lernen - Prototyp
GoF-Entwurfsmuster aus dem Problem 1. Generation
Lernen Sie das Entwurfsmuster "Iterator" mit Python
[Viererbande] Designmuster lernen - Andenken
[Viererbande] Designmuster lernen - Staat
[Vierergruppe] Design Pattern Learning - Interpreter
[Viererbande] Design Pattern Learning - Builder
Lernen Sie das Entwurfsmuster "Strategie" mit Python
[Viererbande] Designmuster lernen - Brücke
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
[Viererbande] Designmuster lernen --Proxy
[Viererbande] Design Pattern Learning - Strategie
[Viererbande] Designmuster lernen --Adapter
Lernen Sie das Designmuster "Facade" mit Python