Ich habe Designmuster geübt, um Code zu schreiben, der sich des Designs bewusst war. Andere Entwurfsmuster werden häufig veröffentlicht.
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.
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.
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.
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
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.
Recommended Posts