Das Factory Method Design Pattern in Python

Einführung

In diesem Artikel werden wir in das in Python implementierte Factory Method Design Pattern eintauchen.

Design Patterns definieren bewährte Lösungen für verschiedene wiederkehrende Probleme in der Softwareentwicklung. Sie stellen keinen tatsächlichen Code dar, sondern Möglichkeiten, wie wir unseren Code für die optimalen Ergebnisse organisieren können.

In einer Welt begrenzter Ressourcen helfen uns Entwurfsmuster, die meisten Ergebnisse mit der geringsten Menge an verwendeten Ressourcen zu erzielen. Es ist auch wichtig zu beachten, dass Entwurfsmuster nicht für alle Situationen gelten und es wichtig ist, das vorliegende Problem zu bewerten, um den besten Ansatz für dieses bestimmte Szenario zu wählen.

Entwurfsmuster sind in einige große Kategorien unterteilt, jedoch hauptsächlich in Kreationsmuster, strukturelle Muster und Verhaltensmuster.

Das Factory-Methodenmuster ist ein kreatives Entwurfsmuster.

Das Entwurfsmuster der Factory-Methode

Definition

Die Factory-Methode wird in der objektorientierten Programmierung verwendet, um Factory-Schnittstellen zum Erstellen von Objekten bereitzustellen. Diese Schnittstellen definieren die generische Struktur, initialisieren jedoch keine Objekte. Die Initialisierung wird spezifischeren Unterklassen überlassen.

Die übergeordnete Klasse / Schnittstelle enthält das gesamte Standard- und generische Verhalten, das für Unterklassen verschiedener Typen gemeinsam genutzt werden kann. Die Unterklasse ist wiederum für die Definition und Instanziierung des Objekts basierend auf der Oberklasse verantwortlich.

Motivation

Die Hauptmotivation hinter dem Entwurfsmuster der Factory-Methode besteht darin, die lose Kopplung im Code durch die Erstellung einer abstrakten Klasse zu verbessern, mit der verschiedene Objekttypen erstellt werden, die einige gemeinsame Attribute und Funktionen gemeinsam haben.

Dies führt zu einer erhöhten Flexibilität und Wiederverwendung von Code, da die gemeinsam genutzte Funktionalität nicht neu geschrieben wird, da sie von derselben Klasse geerbt wurde. Dieses Entwurfsmuster wird auch als virtueller Konstruktor bezeichnet.

Das Entwurfsmuster der Factory-Methode wird häufig in Bibliotheken verwendet, indem Clients ausgewählt werden können, welche Unterklasse oder welcher Objekttyp über eine abstrakte Klasse erstellt werden soll.

Eine Factory-Methode empfängt Informationen über ein erforderliches Objekt, instanziiert es und gibt das Objekt des angegebenen Typs zurück. Dies gibt unserer Anwendung oder Bibliothek einen einzigen Interaktionspunkt mit anderen Programmen oder Codeteilen, wodurch unsere Objekterstellungsfunktionalität gekapselt wird.

Factory Method Implementation

Unser Programm wird eine Bibliothek sein, die für den Umgang mit Formobjekten in Bezug auf die Erstellung und andere Operationen wie das Hinzufügen von Farbe und das Berechnen der Fläche der Form verwendet wird.

Benutzer sollten unsere Bibliothek verwenden können, um neue Objekte zu erstellen. Wir können damit beginnen, einzelne einzelne Formen zu erstellen und sie so zu nutzen, wie sie sind, aber das würde bedeuten, dass für jede verfügbare Form eine Menge gemeinsamer Logik neu geschrieben werden muss.

Der erste Schritt zur Lösung dieses Problems besteht darin, eine übergeordnete Formklasse mit Methoden wie calculate_area() und calculate_perimeter() und Eigenschaften wie Dimensionen zu erstellen.

Die spezifischen Formobjekte erben dann von unserer Basisklasse. Um eine Form zu erstellen, müssen wir identifizieren, welche Art von Form erforderlich ist, und die Unterklasse dafür erstellen.

Wir beginnen mit der Erstellung einer abstrakten Klasse zur Darstellung einer generischen Form:

Dies ist die Basisklasse für alle unsere Formen. Lassen Sie uns einige konkrete, spezifischere Formen erstellen:

Bisher haben wir eine abstrakte Klasse erstellt und erweitert, um sie an verschiedene Formen anzupassen, die in unserer Bibliothek verfügbar sein werden. Um die verschiedenen Formobjekte zu erstellen, müssen die Kunden die Namen und Details unserer Formen kennen und die Erstellung separat durchführen.

Hier kommt die Factory-Methode ins Spiel.

Das Entwurfsmuster der Factory-Methode hilft uns, die verfügbaren Formen vom Client zu abstrahieren, dh der Client muss nicht alle verfügbaren Formen kennen, sondern nur das erstellen, was er zur Laufzeit benötigt. Es wird uns auch erlauben, die Objekterstellung zu zentralisieren und zu kapseln.

Lassen Sie uns dies erreichen, indem wir eine ShapeFactory erstellen, mit der die spezifischen Formklassen basierend auf den Eingaben des Kunden erstellt werden:

Dies ist unsere Schnittstelle zur Erstellung. Wir rufen nicht die Konstruktoren konkreter Klassen auf, sondern die Factory und bitten sie, eine Form zu erstellen.

Unser ShapeFactory empfängt Informationen über eine Form wie einen Namen und die erforderlichen Abmessungen. Unsere Factory-Methode create_shape() wird dann verwendet, um fertige Objekte der gewünschten Formen zu erstellen und zurückzugeben.

Der Client muss nichts über die Objekterstellung oder Besonderheiten wissen. Mit dem Factory-Objekt können sie Objekte mit minimalem Wissen über ihre Funktionsweise erstellen:

Das Ausführen dieses Codes führt zu:

Oder wir könnten eine andere Form erstellen:

Bemerkenswert ist, dass der Client nicht viel über den Erstellungsprozess wissen muss – wenn wir ein Objekt instanziieren möchten, rufen wir den Konstruktor der Klasse nicht auf. Wir bitten die Fabrik, dies für uns zu tun, basierend auf den Informationen, die wir an die create_shape() -Funktion übergeben.

Vor- und Nachteile

Vorteile

Einer der Hauptvorteile der Verwendung des Entwurfsmusters für die Factory-Methode besteht darin, dass unser Code lose gekoppelt wird, da die Mehrheit der Komponenten unseres Codes andere Komponenten derselben Codebasis nicht kennt.

Dies führt zu Code, der leicht zu verstehen und zu testen ist und bestimmten Komponenten mehr Funktionalität hinzufügt, ohne das gesamte Programm zu beeinträchtigen oder zu unterbrechen.

Das Entwurfsmuster für Factory-Methoden hilft auch dabei, das Prinzip der einzelnen Verantwortung aufrechtzuerhalten, bei dem Klassen und Objekte, die bestimmte Funktionen verarbeiten, zu besserem Code führen.

Cons

Die Erstellung von mehr Klassen führt schließlich zu weniger Lesbarkeit. In Kombination mit einer abstrakten Factory (Factory of Factories) wird der Code jedoch bald ausführlich und wartbar.

Fazit

Zusammenfassend können wir mit dem Entwurfsmuster der Factory-Methode Objekte erstellen, ohne die genaue Klasse anzugeben, die zum Erstellen des jeweiligen Objekts erforderlich ist. Dadurch können wir unseren Code entkoppeln und seine Wiederverwendbarkeit verbessern.

Es ist wichtig zu beachten, dass es wie jedes andere Entwurfsmuster nur für bestimmte Situationen und nicht für jedes Entwicklungsszenario geeignet ist. Eine Bewertung der vorliegenden Situation ist entscheidend, bevor Sie sich für die Implementierung des Factory Method Design Pattern entscheiden, um die Vorteile des Musters zu nutzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.