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++