Fabrik Muster

 Sean Bradley
Sean Bradley

Folgen

9. Apr 2019 · 4 min Lesezeit

Bei der Entwicklung von Code können Sie Objekte direkt in Methoden oder in Klassen instanziieren. Obwohl dies ganz normal ist, möchten Sie möglicherweise eine zusätzliche Abstraktion zwischen der Erstellung des Objekts und der Verwendung in Ihrem Projekt hinzufügen.

Sie können das Factory-Muster verwenden, um diese zusätzliche Abstraktion hinzuzufügen. Das Factory-Muster ist eines der am einfachsten zu verstehenden und zu implementierenden Muster.

Wenn Sie eine zusätzliche Abstraktion hinzufügen, können Sie auch dynamisch Klassen auswählen, die basierend auf einer Art Logik instanziiert werden sollen.

Vor der Abstraktion würde Ihre Klasse oder Methode direkt eine konkrete Klasse erstellen. Nach dem Hinzufügen der Factory-Abstraktion wird die konkrete Klasse jetzt außerhalb der aktuellen Klasse / Methode und jetzt in einer Unterklasse erstellt.

Stellen Sie sich eine Anwendung zum Entwerfen von Häusern vor, und das Haus hat standardmäßig bereits einen Stuhl auf dem Boden hinzugefügt. Durch Hinzufügen des Factory-Musters können Sie dem Benutzer die Möglichkeit geben, verschiedene Stühle auszuwählen und wie viele zur Laufzeit. Anstatt dass der Stuhl beim Start fest in das Projekt codiert wurde, hat der Benutzer jetzt die Möglichkeit zu wählen.

Das Hinzufügen dieser zusätzlichen Abstraktion bedeutet auch, dass die Komplikationen beim Instanziieren zusätzlicher Objekte jetzt vor der Klasse oder Methode verborgen werden können, die sie verwendet.

Diese Trennung erleichtert auch das Lesen und Dokumentieren Ihres Codes.

Beim Factory-Muster geht es wirklich darum, diese zusätzliche Abstraktion zwischen der Objekterstellung und dem Ort, an dem sie verwendet wird, hinzuzufügen. Dadurch erhalten Sie zusätzliche Optionen, die Sie in Zukunft einfacher erweitern können.

  • Konkreter Ersteller: Die Clientanwendung, Klasse oder Methode, die den Ersteller aufruft (Factory-Methode).
  • Produktschnittstelle: Die Schnittstelle, die die Attribute und Methoden beschreibt, die die Fabrik benötigt, um das endgültige Produkt / Objekt zu erstellen.
  • Schöpfer: Die Fabrikklasse. Deklariert die Factory-Methode, die das von ihr angeforderte Objekt zurückgibt.
  • Konkretes Produkt: Das von der Fabrik zurückgegebene Objekt. Das Objekt implementiert die Produktschnittstelle.

Fabrik-UML-Diagramm

Factory-Muster UML-Diagramm

Quellcode

In diesem Konzeptbeispiel möchte der Client ein Objekt mit dem Namen b

Anstatt b direkt im Client zu erstellen, fragt er stattdessen den Ersteller (Factory) nach dem Objekt.

Die Factory findet die relevante Klasse mithilfe einer Logik aus den Attributen der Anforderung. Anschließend fordert es die Unterklasse auf, das neue Objekt zu instanziieren, das es dann als Referenz an den Client zurückgibt und danach fragt.

./factory/factory_concept.py

"""
The Factory Pattern Concept
https://sbcode.net/python/factory/#factoryfactory_conceptpy
"""from abc import ABCMeta, abstractmethodclass IProduct(metaclass=ABCMeta):
"A Hypothetical Class Interface (Product)" @staticmethod
@abstractmethod
def create_object():
"An abstract interface method"class ConcreteProductA(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductA" def create_object(self):
return selfclass ConcreteProductB(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductB" def create_object(self):
return selfclass ConcreteProductC(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductC" def create_object(self):
return selfclass Creator:
"The Factory Class" @staticmethod
def create_object(some_property):
"A static method to get a concrete product"
if some_property == 'a':
return ConcreteProductA()
if some_property == 'b':
return ConcreteProductB()
if some_property == 'c':
return ConcreteProductC()
return None# The Client
PRODUCT = Creator().create_object('b')
print(PRODUCT.name)

Ausgang

python ./factory/factory_concept.py 
ConcreteProductB

Fabrik Muster Übersicht Video

Beispiel Anwendungsfall

Besuchen Sie Factory – Design Patterns In Python (sbcode.net ) für einen Beispielanwendungsfall des Factory-Musters.

Ein Anwendungsbeispiel ist eine Benutzeroberfläche, in der der Benutzer aus einem Menü von Elementen auswählen kann, z. B. Stühle.

Der Benutzer hat eine Auswahl über eine Art Navigationsschnittstelle getroffen, und es ist nicht bekannt, welche Auswahl oder wie viele der Benutzer treffen wird, bis die Anwendung tatsächlich ausgeführt wird und der Benutzer sie verwendet.

Wenn der Benutzer den Stuhl auswählt, nimmt die Factory dann eine Eigenschaft, die mit dieser Auswahl verbunden ist, z. B. eine ID, einen Typ oder ein anderes Attribut, und entscheidet dann, welche relevante Unterklasse instanziiert werden soll, um das entsprechende Objekt zurückzugeben.

Reales Beispiel für das verwendete Factory-Muster

Im obigen GIF finden Sie ein sehr grafisches Beispiel für ein reales Beispiel für die Verwendung des Factory-Musters zur Rückgabe von Stuhlobjekten. Das Bedienfeld links enthält Stühle, und wenn Sie einen Stuhl per Drag & Drop in das Bedienfeld rechts ziehen, wird die Stuhlfabrik aufgerufen, um ihm einen Stuhl zurückzugeben.

Anwendungsfallvideo für Factory-Muster

Zusammenfassung

  • Das Factory-Muster ist eine Schnittstelle, die die Erstellung des endgültigen Objekts auf eine Unterklasse verschiebt.
  • Beim Factory-Muster geht es darum, eine weitere Ebene / Abstraktion zwischen der Instanziierung eines Objekts und der Stelle in Ihrem Code einzufügen, an der es tatsächlich verwendet wird.
  • Es ist nicht bekannt, welche oder wie viele Objekte bis zur Laufzeit erstellt werden müssen.
  • Sie möchten das Wissen über die Besonderheiten der Instanziierung eines bestimmten Objekts in der Unterklasse lokalisieren, damit sich der Client nicht um die Details kümmern muss.
  • Sie möchten ein externes Framework erstellen, das eine Anwendung importieren / referenzieren kann, und die Details der Besonderheiten ausblenden, die bei der Erstellung des endgültigen Objekts / Produkts erforderlich sind.
  • Der einzigartige Faktor, der das Factory-Muster definiert, besteht darin, dass Ihr Projekt die Erstellung von Objekten jetzt auf die Unterklasse verschiebt, an die die Factory es delegiert hat.

Entwurfsmuster in Python (Buch)

Manchmal möchte man einfach nur den Computer ausschalten und aus einem Buch lesen. Dieses Muster sowie alle anderen GoF-Muster werden in meinen Entwurfsmustern im Python-Buch ASIN B08XLJ8Z2J