Czy ktoś może wyjaśnić różnicę między wzorcami fabrycznymi a strategicznymi?
Dla mnie oba wyglądają tak samo poza dodatkową klasą fabryczną (która tworzy obiekt produktu we wzorach fabrycznych)
źródło
Czy ktoś może wyjaśnić różnicę między wzorcami fabrycznymi a strategicznymi?
Dla mnie oba wyglądają tak samo poza dodatkową klasą fabryczną (która tworzy obiekt produktu we wzorach fabrycznych)
Wzorzec fabryczny to wzorzec kreacyjny. Wzorzec strategii to wzorzec operacyjny. Innymi słowy, wzorzec fabryki jest używany do tworzenia obiektów określonego typu. Wzorzec strategii służy do wykonywania operacji (lub zestawu operacji) w określony sposób. W klasycznym przykładzie fabryka może tworzyć różne typy zwierząt: psa, kota, tygrysa, podczas gdy wzorzec strategii wykonywałby określone czynności, na przykład ruch; za pomocą strategii biegu, chodu lub skoku.
W rzeczywistości oba mogą być używane razem. Na przykład może istnieć fabryka, która tworzy obiekty biznesowe. Może używać różnych strategii opartych na nośniku trwałości. Jeśli twoje dane są przechowywane lokalnie w XML, użyje jednej strategii. Gdyby dane były zdalne w innej bazie danych, użyłaby innej.
Wzorzec strategii pozwala na polimorficzną zmianę zachowania klasy.
Wzorzec fabryki umożliwia hermetyzację tworzenia obiektów.
Gary ma świetną uwagę. Jeśli używasz zasady kodowania do abstrakcji, a nie do „konkrecji”, wtedy wiele wzorców zaczyna wyglądać jak wariacje na temat.
źródło
Aby dodać do tego, co powiedział tvanfosson, wiele wzorców wygląda tak samo, jeśli chodzi o implementację. Oznacza to, że często tworzyłeś interfejs, w którym być może wcześniej nie było go w kodzie, a następnie tworzyłeś kilka implementacji tego interfejsu. Różnica polega na ich przeznaczeniu i sposobie ich wykorzystania.
źródło
Twórz tylko konkretne wystąpienia. Różne argumenty mogą dawać różne obiekty. To zależy od logiki itp.
Hermetyzuj algorytm (kroki), aby wykonać akcję. Możesz więc zmienić strategię i użyć innego algorytmu.
Chociaż oba wyglądają na bardzo podobne, cel jest raczej inny, jednym celem jest stworzenie, drugim jest wykonanie działania.
Więc. Jeśli twoja metoda Factory jest naprawiona, możesz mieć to w następujący sposób:
Ale przypuśćmy, że Twoja fabryka potrzebuje bardziej zaawansowanej lub dynamicznej kreacji. Możesz dodać do metody fabrycznej strategię i zmienić ją bez konieczności ponownej kompilacji, strategia może ulec zmianie w czasie wykonywania.
źródło
Przede wszystkim należy rozróżnić między prostą fabryką a fabryką abstrakcyjną. Pierwsza to prosta fabryka, w której masz tylko jedną klasę, która działa jako fabryka do tworzenia obiektów, podczas gdy w drugiej łączysz się z interfejsem fabrycznym (który definiuje nazwy metod), a następnie wywołujesz różne fabryki, które implementują ten interfejs, mają mieć różne implementacje tej samej metody w oparciu o pewne kryteria. Na przykład mamy interfejs ButtonCreationFactory, który jest zaimplementowany w dwóch fabrykach, pierwsza WindowsButtonCreationFactory (tworzy przyciski o wyglądzie i działaniu systemu Windows), a druga LinuxButtonCreationFactory (tworzy przyciski o wyglądzie i działaniu systemu Linux). Tak więc obie te fabryki mają tę samą metodę tworzenia z różnymi implementacjami (algorytmami).
Na przykład, jeśli chcesz, aby przyciski wyglądały i działały w systemie Linux:
lub jeśli chcesz przyciski systemu Windows
Dokładnie w tym przypadku daje to swego rodzaju wzorzec strategii, ponieważ różnicuje algorytmy wykonywania jakiejś kreacji. Jednak różni się od niego semantycznie, ponieważ jest używany do TWORZENIA OBIEKTÓW, a nie algorytmów operacyjnych. Tak więc, w zasadzie w fabryce abstrakcyjnej masz tworzenie obiektów przy użyciu różnych strategii, co czyni je bardzo podobnymi do wzorca strategii. Jednak AbstractFactory jest twórczy, podczas gdy wzorzec Strategii działa. Jeśli chodzi o wdrażanie, wynikają one z tego samego.
źródło
Fabryka (i metoda FactoryMethod zwrócona przez fabrykę) :
Spójrz na ten artykuł na Wikipedii i artykuł javarevisited
Wzorzec strategii:
Przykład:
Możesz skonfigurować strategię rabatów dla określonej pozycji (bilet lotniczy lub przedmiot ShoppingCart). W tym przykładzie zaoferujesz 25% zniżki na przedmiot w okresie od lipca do grudnia i brak rabatu na przedmiot w okresie od czerwca do czerwca.
Powiązane posty:
Przykład wzorca strategii w świecie rzeczywistym
Wzorce projektowe: metoda Factory vs Factory vs Abstract Factory
źródło
Aby rozszerzyć to, co powiedział Oscar i w odniesieniu do jego kodu:
GetCommand to Factory, a klasy UnixCommand, WindowsCommand i OSXCommand to strategie
źródło
Wzorzec strategii, mówiąc najprościej, polega bardziej na tworzeniu zachowania w czasie wykonywania, w którym nie jesteś zainteresowany klasą implementującą. Z drugiej strony fabryka jest tworzeniem w czasie wykonywania konkretnej instancji klasy i do Ciebie należy użycie dowolnego zachowania (metody) udostępnionego przez zaimplementowany interfejs.
źródło
Nie można zrozumieć różnicy po prostu patrząc na kod lub kategoryzację. Aby poprawnie uchwycić wzorce GoF, poszukaj ich intencji:
Strategia: „Zdefiniuj rodzinę algorytmów, hermetyzuj każdy z nich i uczyń je wymiennymi. Strategia pozwala zmieniać algorytm niezależnie od klientów, którzy go używają”.
Metoda fabryczna: „Zdefiniuj interfejs do tworzenia obiektu, ale pozwól podklasom zdecydować, która klasa ma zostać utworzona. Metoda fabryki umożliwia odroczenie instancji klasy do podklas”.
A oto szczegółowe wyjaśnienie dotyczące zamiarów i różnic między tymi dwoma wzorcami: Różnica między wzorcami projektowania metody fabrycznej i strategii
źródło
Mogę dygresować z Oscarem, ponieważ jego przykład implementacji Factory jest raczej ściśle powiązany i bardzo zamknięty, nic dziwnego, że wybierasz wzorzec strategii. Implementacja Factory nie powinna zależeć od ustalonej liczby tworzonych wystąpień określonych klas, na przykład:
Wydaje mi się, że najbardziej odpowiednim kryterium wyboru jednego lub drugiego są głównie terminy, których używasz do nazwania swoich klas i metod, biorąc pod uwagę, że wszyscy powinniśmy programować do interfejsów, a nie do klas, a także skupiać się na celu: naszym celem jest określenie który kod będzie wykonywany w czasie wykonywania. To powiedziawszy, możemy osiągnąć cel, używając dowolnego z obu wzorców.
źródło
Strategia i fabryka to różne cele. W strategii masz zdefiniowane podejście, używając tego wzorca możesz zamienić zachowanie (algorytmy). W przypadku Factory, istnieje wiele odmian. Ale oryginalny wzorzec z fabryki stanów GO4 pozostawia tworzenie obiektu klasie potomnej. Tutaj fabryką zastępujesz całą instancję, a nie zachowanie, które Cię interesuje. W ten sposób zastąpisz cały system, a nie algorytm.
źródło
Wzorzec fabryczny to wzorzec kreacyjny, który jest tworzony z określonymi właściwościami (zachowaniem). podczas gdy w czasie wykonywania po utworzeniu nie możesz zmienić jego właściwości (zachowania). więc jeśli potrzebujesz innych właściwości (zachowania), musisz usunąć obiekt i utworzyć nowy obiekt z wymaganymi właściwościami (zachowaniem). co nie jest gud. podczas gdy w przypadku wzorca strategii u można zmienić właściwości (zachowanie) w czasie wykonywania.
źródło