Die Factory-Methode ist ein gestalterisches Entwurfsmuster, mit dem eine Schnittstelle oder eine Klasse ein Objekt erstellen kann, aber Unterklassen entscheiden können, welche Klasse oder welches Objekt instanziiert werden soll. Mit der Factory-Methode haben wir die besten Möglichkeiten, ein Objekt zu erstellen. Hier werden Objekte erstellt, ohne dem Client die Logik zur Verfügung zu stellen, und zum Erstellen des neuen Objekttyps verwendet der Client dieselbe gemeinsame Schnittstelle.
Probleme, mit denen wir ohne Factory-Methode konfrontiert sind:
Stellen Sie sich vor, Sie haben Ihr eigenes Startup, das Mitfahrgelegenheiten in den verschiedenen Teilen des Landes anbietet. Die erste Version der App bietet nur die Zweirad-Mitfahrgelegenheit, aber im Laufe der Zeit wird Ihre App populär und jetzt möchten Sie auch Drei- und Vierrad-Mitfahrgelegenheiten hinzufügen.
Es ist eine großartige Neuigkeit! aber was ist mit den Softwareentwicklern Ihres Startups. Sie müssen den gesamten Code ändern, da jetzt der größte Teil des Codes mit der Zweiradklasse gekoppelt ist und Entwickler Änderungen an der gesamten Codebasis vornehmen müssen.
Nachdem alle diese Änderungen vorgenommen wurden, enden die Entwickler entweder mit dem unordentlichen Code oder mit dem Rücktrittsschreiben.
Localizer App
Schematische Darstellung von Problemen ohne Verwendung der Factory-Methode
Lassen Sie uns das Konzept anhand eines weiteren Beispiels verstehen, das sich auf die Übersetzungen und Lokalisierung der verschiedenen Sprachen bezieht.
Angenommen, wir haben eine App erstellt, deren Hauptzweck darin besteht, eine Sprache in eine andere zu übersetzen, und derzeit funktioniert unsere App nur mit 10 Sprachen. Jetzt ist unsere App bei Menschen sehr beliebt geworden, aber die Nachfrage ist plötzlich auf 5 weitere Sprachen angewachsen.
Es ist eine großartige Neuigkeit! nur für den Eigentümer, nicht für die Entwickler. Sie müssen den gesamten Code ändern, da jetzt der größte Teil des Codes nur noch mit den vorhandenen Sprachen gekoppelt ist, und deshalb müssen Entwickler Änderungen an der gesamten Codebasis vornehmen, was wirklich eine schwierige Aufgabe ist.
Schauen wir uns den Code für das Problem an, mit dem wir möglicherweise konfrontiert sind, ohne die Factory-Methode zu verwenden.
Hinweis: Der folgende Code wird ohne Verwendung der Factory-Methode geschrieben.
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
if
__name__
=
=
"__main__"
:
f
=
FrenchLocalizer()
e
=
EnglishLocalizer()
s
=
SpanishLocalizer()
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
Lösung nach Factory-Methode:
Die Lösung besteht darin, die einfachen Objektkonstruktionsaufrufe durch Aufrufe der speziellen Factory-Methode zu ersetzen. Tatsächlich gibt es keinen Unterschied in der Objekterstellung, aber sie werden innerhalb der Factory-Methode aufgerufen.
Beispiel: Unsere Klassen Two_Wheeler, Three_Wheeler und Four_wheeler sollten die Ridesharing-Schnittstelle implementieren, die eine Methode namens ride deklariert. Jede Klasse implementiert diese Methode eindeutig.
solution_factory_diagram
Lassen Sie uns nun die Factory-Methode anhand eines Beispiels verstehen:
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
def
Factory(language
=
"English"
):
localizers
=
{
"French"
: FrenchLocalizer,
"English"
: EnglishLocalizer,
"Spanish"
: SpanishLocalizer,
}
return
localizers()
if
__name__
=
=
"__main__"
:
f
=
Factory(
"French"
)
e
=
Factory(
"English"
)
s
=
Factory(
"Spanish"
)
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
Klassendiagramm für Factory-Methode:
Schauen wir uns das Klassendiagramm am Beispiel der Mitfahrgelegenheit an.
Factory_pattern_class_diagrma
Vorteile der Verwendung der Factory-Methode:
- Wir können die neuen Produkttypen problemlos hinzufügen, ohne den vorhandenen Client-Code zu stören.
- Generell wird eine enge Kopplung zwischen den Produkten und den Erstellerklassen und -objekten vermieden.
Nachteile der Verwendung der Factory-Methode:
- Um ein bestimmtes konkretes Produktobjekt zu erstellen, muss der Client möglicherweise die Creator-Klasse unterordnen.
- Sie erhalten eine große Anzahl kleiner Dateien, dh ein Durcheinander der Dateien.
- In einem Grafiksystem kann es je nach Eingabe des Benutzers verschiedene Formen wie Rechteck, Quadrat, Kreis usw. zeichnen. Zur Erleichterung sowohl der Entwickler als auch des Clients können wir jedoch die Factory-Methode verwenden, um die Instanz abhängig von den Benutzereingaben zu erstellen. Dann müssen wir den Client-Code nicht ändern, um eine neue Form hinzuzufügen.
- Auf einer Hotelbuchungsseite können wir einen Platz für 1 Zimmer, 2 Zimmer, 3 Zimmer usw. buchen. Hier kann der Benutzer die Anzahl der Zimmer eingeben, die er buchen möchte. Mit der Factory-Methode können wir jederzeit eine Factory-Klasse erstellen, die uns hilft, die Instanz abhängig von den Benutzereingaben zu erstellen. Auch hier müssen wir den Code des Kunden nicht ändern, um die neue Einrichtung hinzuzufügen.
Anwendbarkeit :
Lesen Sie weiter: Factory-Muster in C++