metoda fabryczna jest Kreacyjnym wzorcem projektowym, który pozwala interfejsowi lub klasie utworzyć obiekt, ale niech podklasy decydują, która klasa lub obiekt ma zostać utworzona. Korzystając z metody Fabrycznej, mamy najlepsze sposoby na utworzenie obiektu. Tutaj obiekty są tworzone bez wystawiania logiki na klienta, a do stworzenia nowego typu obiektu klient używa tego samego wspólnego interfejsu.
problemy, z którymi borykamy się bez metody Fabrycznej:
wyobraź sobie, że masz własny startup, który zapewnia współdzielenie przejazdów w różnych częściach kraju. Początkowa wersja aplikacji zapewnia tylko dwukołowy jeździectwo, ale w miarę upływu czasu, Twoja aplikacja staje się popularna i teraz chcesz dodać trzy i czterokołowy jeździectwo również.
to świetna wiadomość! ale co z programistami twojego startupu. Muszą zmienić cały kod, ponieważ teraz większość kodu jest sprzężona z klasą dwukołowców, a programiści muszą wprowadzić zmiany w całej bazie kodu.
po tych wszystkich zmianach albo deweloperzy kończą z brudnym kodem, albo z listem rezygnacji.
aplikacja Localizer
schematyczne przedstawianie problemów bez użycia metody Fabrycznej
zrozummy koncepcję z jeszcze jednym przykładem, który jest związany z tłumaczeniami i lokalizacją różnych języków.
Załóżmy, że stworzyliśmy aplikację, której głównym celem jest tłumaczenie jednego języka na drugi i obecnie nasza aplikacja działa tylko w 10 językach. Teraz nasza aplikacja stała się bardzo popularna wśród ludzi, ale zapotrzebowanie nagle wzrosło do włączenia 5 Więcej języków.
to świetna wiadomość! tylko dla właściciela, nie dla deweloperów. Muszą zmienić cały kod, ponieważ teraz większość kodu jest połączona tylko z istniejącymi językami i dlatego programiści muszą wprowadzić zmiany w całej bazie kodu, co jest naprawdę trudnym zadaniem.
spójrzmy na kod problemu, z którym możemy się zmierzyć bez użycia metody fabrycznej.
Uwaga: Poniższy kod jest zapisywany bez użycia metody Fabrycznej.
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))
rozwiązanie metodą fabryczną:
jego rozwiązaniem jest zastąpienie prostych wywołań konstrukcji obiektu wywołaniami do specjalnej metody fabrycznej. W rzeczywistości nie będzie różnicy w tworzeniu obiektów, ale są one wywoływane w metodzie fabrycznej.
na przykład: Nasze klasy Two_Wheeler, Three_Wheeler i Four_wheeler powinny implementować interfejs współdzielenia przejazdów, który deklaruje metodę o nazwie ride. Każda klasa zaimplementuje tę metodę w unikalny sposób.
solution_factory_diagram
teraz pozwól nam zrozumieć metodę fabryczną za pomocą przykładu:
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))
Diagram klas dla metody Fabrycznej:
spójrzmy na diagram klas biorąc pod uwagę przykład współdzielenia jazdy.
Factory_pattern_class_diagrma
zalety stosowania metody Fabrycznej:
- możemy łatwo dodać nowe typy produktów bez naruszania istniejącego kodu klienta.
- generalnie unika się ścisłego sprzężenia między produktami a klasami i obiektami twórców.
wady stosowania metody Fabrycznej:
- aby utworzyć konkretny konkretny obiekt produktu, Klient może być zmuszony do podklasy klasy creator.
- kończysz z ogromną liczbą małych plików, tj. bałaganem plików.
- w systemie graficznym, w zależności od wejścia użytkownika, może rysować różne kształty, takie jak prostokąt, kwadrat, koło itp. Ale dla łatwości zarówno programistów, jak i klienta, możemy użyć metody fabrycznej do utworzenia instancji w zależności od danych wejściowych użytkownika. Wtedy nie musimy zmieniać kodu klienta, aby dodać nowy kształt.
- na stronie rezerwacyjnej hotelu można zarezerwować miejsce na 1 pokój, 2 pokoje, 3 pokoje itp. Tutaj użytkownik może wprowadzić liczbę pokoi, które chce zarezerwować. Korzystając z metody factory, możemy utworzyć klasę fabryczną AnyRooms, która pomoże nam stworzyć instancję w zależności od danych wejściowych użytkownika. Ponownie nie musimy zmieniać kodu klienta, aby dodać nowy obiekt.
:
Czytaj dalej: wzór fabryczny w C++