Uwaga: pytania znajdują się na końcu postu.
Przeczytałem inne wątki stackoverflow dotyczące Abstract Factory vs Factory Method . Rozumiem intencję każdego wzoru. Nie mam jednak jasności co do definicji.
Factory Method definiuje interfejs do tworzenia obiektu, ale pozwala podklasom zdecydować, które z nich mają zostać utworzone. Metoda fabryczna pozwala klasom odroczyć tworzenie instancji do podklas.
Z kolei fabryka abstrakcyjna zapewnia interfejs do tworzenia rodzin powiązanych lub zależnych obiektów bez określania ich konkretnych klas.
Abstract Factory wygląda bardzo podobnie do metody fabryki . Narysowałem kilka klas UML, aby zilustrować mój punkt widzenia.
Uwaga:
- Diagram pochodzi z www.yuml.com, więc nie są one idealnie zorientowane. Ale to darmowa usługa :).
- Diagramy mogą nie być doskonałe. Wciąż uczę się wzorców projektowych GoF .
Metoda fabryczna:
Abstract Factory (tylko 1 członek):
Abstract Factory (więcej członków):
Pytania:
- Jeśli Fabryka Abstrakcji ma tylko jednego twórcę i jeden produkt, czy nadal jest to wzorzec Fabryki Abstrakcji ? (interfejs do tworzenia rodzin)
- Czy kreator betonu Factory Method można utworzyć z interfejsu, czy też musi on pochodzić z klasy? (klasy odraczają instancje do podklas)
- Jeśli Fabryka Abstrakcji może mieć tylko jednego twórcę i jeden produkt, to czy jedyną różnicą między Fabryką Abstrakcji a Metodą Fabryczną jest to, że twórcą pierwszej jest Interfejs, a twórcą drugiej jest Klasa?
Odpowiedzi:
Mam nadzieję że to pomoże. Opisuje różne typy fabryk. Jako odniesienie użyłem Head First Design Patterns . Użyłem yuml.me do tworzenia diagramu.
Fabryka statyczna
To klasa z metodą statyczną do wytwarzania różnych podtypów produktów.
Prosta fabryka
To klasa, która może wytwarzać różne podtypy produktów. (Jest lepszy niż Static Factory. Gdy dodawane są nowe typy, podstawowa klasa produktu nie musi być zmieniana tylko na prostą klasę fabryczną)
Metoda fabryczna
Zawiera jedną metodę wytwarzania jednego rodzaju produktu związanego z jego rodzajem. (Jest lepszy niż Simple Factory, ponieważ typ jest odroczony do podklasy.)
Fabryka abstrakcyjna
Tworzy rodzinę typów, które są ze sobą powiązane. Różni się ona wyraźnie od metody fabrycznej, ponieważ ma więcej niż jedną metodę typów, które wytwarza. (Jest to skomplikowane, patrz następny diagram, aby uzyskać lepszy przykład z życia wzięty).
Przykład z .NET Framework
DbFactoriesProvider jest prostą fabryką, ponieważ nie ma podtypów. DbFactoryProvider to fabryka abstrakcyjna, ponieważ może tworzyć różne powiązane obiekty bazy danych, takie jak obiekty połączeń i poleceń.
Wcześniejsze
źródło
Product
(w skrócie), a potemProduct1
iProduct2
jako synowie? To pomogłoby w stwierdzeniu, że Metoda Fabryczna polega tylko na stworzeniu jednego produktu, podczas gdy Fabryka Abstrakcyjna to mniej więcej zbiór metod Fabrycznych zebranych razem w rodziny.Te dwa wzorce są z pewnością powiązane!
Różnica między wzorami jest generalnie intencjonalna.
Intencja od Factory Method jest „Zdefiniować interfejs do tworzenia obiektu, ale niech podklasy zdecydować jakiej klasy instancji. Metoda pozwala na fabryczne instancji klasy odraczać podklasy.”
Zamiar z Abstract Factory jest „Zapewnienie interfejs do tworzenia rodzin powiązanych lub zależnych obiektów bez określania ich konkretnych klas.”
Opierając się wyłącznie na tych stwierdzeniach intencyjnych (cytowanych z GoF), powiedziałbym, że rzeczywiście Metoda Fabryki jest w pewnym sensie „zdegenerowaną” Fabryką Abstrakcyjną z jedną rodziną.
Zwykle różnią się implementacją, ponieważ Metoda Fabryczna jest dużo prostsza niż Fabryka Abstrakcyjna .
Są one jednak powiązane również w realizacji. Jak zauważono w książce GoF,
Ta wiki c2 również zawiera interesującą dyskusję na ten temat.
źródło
Wydaje się, że lista (doskonałych) pytań PO została zignorowana. Aktualne odpowiedzi podają jedynie przeformułowane definicje. Dlatego spróbuję zwięźle odpowiedzieć na pierwotne pytania.
Nie . Fabryka abstrakcyjna musi stworzyć więcej niż jeden produkt, aby stworzyć „rodzinę powiązanych produktów”. Przykład kanonicznego GoF tworzy
ScrollBar()
iWindow()
. Zaletą (i celem) jest to, że Abstract Factory może wymusić wspólny motyw w wielu swoich produktach.Po pierwsze, musimy zauważyć, że ani Java, ani C # nie istniały, kiedy GoF pisali swoją książkę. Użycie terminu interfejs przez GoF nie jest związane z typami interfejsów wprowadzonymi przez poszczególne języki. Dlatego też kreator betonu można utworzyć z dowolnego interfejsu API. Ważnym punktem we wzorcu jest to, że API używa własnej metody fabrycznej, więc interfejs z tylko jedną metodą nie może być metodą fabryczną, tak samo jak nie może być fabryką abstrakcyjną.
To pytanie nie jest już aktualne, po odpowiedziach powyżej; jeśli jednak myślisz, że jedyną różnicą między Abstract Factory a Factory Method jest liczba utworzonych produktów, zastanów się, w jaki sposób klient konsumuje każdy z tych wzorców. Fabryka abstrakcyjna jest zwykle wstrzykiwana do swojego klienta i wywoływana poprzez kompozycję / delegację. Należy odziedziczyć metodę fabryczną. Więc wszystko wraca do starej debaty na temat składu i dziedziczenia.
Ale te odpowiedzi wywołały czwarte pytanie!
Jeśli metoda jest statyczna, jest powszechnie nazywana statyczną fabryką . Jeśli metoda jest niestatyczna, jest powszechnie nazywana prostą fabryką . Żaden z nich nie jest wzorcem GoF, ale w praktyce są one znacznie częściej używane!
źródło
Moim zdaniem niewielka różnica między tymi dwoma wzorami polega na stosowalności , a więc, jak już powiedziano, w Intencji .
Podsumujmy definicje (obie z Wikipedii).
Fabryka abstrakcyjna
Metoda fabryczna
Oba wzorce pozwalają oddzielić obiekty użytkownika od tworzenia potrzebnych instancji (oddzielenie w czasie wykonywania) i jest to wspólny aspekt. Oba schematy pozwalają na stworzenie hierarchii fabryk według konkretnych potrzeb i jest to kolejny wspólny aspekt.
Abstract Factory pozwala na tworzenie kilku różnych typów instancji w jednej podklasie i uszczegółowienie zachowania kreacji w jej różnych podklasach; normalnie metoda Factory deklaruje utworzenie tylko jednego typu obiektu, który można uszczegółowić zgodnie z mechanizmem podklas. To jest różnica.
Podsumowując. Powiedzmy, że Product definiuje superklasę tworzonych obiektów, a ProductA i ProductB to dwie różne podklasy. Dlatego metoda Abstract Factory będzie miała dwie metody, createProductA () i createProductB (), które zostaną uszczegółowione (pod względem kroków tworzenia) w swoich określonych podklasach: podklasy fabryki wyszczególniają kroki tworzenia dla dwóch zdefiniowanych klas obiektów w trakcie tworzenia.
Zgodnie z powyższym przykładem, Metoda Fabryki zostanie zaimplementowana w różny sposób, abstrahując tworzenie ProduktuA i ProduktuB w tylu fabrykach (jedna metoda na Fabrykę), a dalsza specjalizacja kroków tworzenia zostanie przekazana hierarchii w miarę jej budowania .
źródło
Gdybym utworzył abstrakcyjną (do której odwołuje się interfejs lub abstrakcyjna klasa bazowa) klasę Factory, która tworzy obiekty, które mają tylko jedną metodę tworzenia obiektów, to byłaby to metoda Factory .
Gdyby wyabstrahowana fabryka miała więcej niż 1 metodę tworzenia obiektów, byłaby to fabryka abstrakcyjna .
Powiedzmy, że tworzę Menedżera, który będzie obsługiwał potrzeby metod akcji dla kontrolera MVC. Gdyby miał jedną metodę, powiedzmy do tworzenia obiektów silnika, które będą używane do tworzenia modeli widoków, byłby to wzorzec metody fabryki. Z drugiej strony, gdyby miał dwie metody: jedną do tworzenia silników modelu widoku, a drugą do tworzenia silników modeli działań (lub jakkolwiek chcesz nazwać model, że metoda akcji zawiera konsumentów), byłaby to fabryka abstrakcyjna.
źródło
Chociaż minęło już wiele lat, odkąd ludzie ze StackOverflow podobnie pytali o ten problem w innych postach (najstarszy pochodzi z 2009 r.), Nadal nie mogłem znaleźć odpowiedzi, której szukałem.
Zrobiłem więc kilka godzin przeszukiwania sieci, przeglądając przykłady i doszedłem do wniosku, że główne różnice między Abstract Factory a Factory Method to
Przykłady liczników byłyby
Dlatego też, gdy końcowa grupa obiektów powinna mieć ten sam styl bez wyjątku obiektu, a chcesz ukryć ten szczegół dotyczący zachowania tego samego stylu, powinniśmy użyć Abstract Factory.
źródło
O ile rozumiem znaczenie o Definicje abstrakcyjnej fabryki i metody Factory, pierwsza jest zaimplementowana w kontekście statycznym i dostarcza obiekt na podstawie parametrów wejściowych.
Drugi wykorzystuje już utworzony obiekt (rodzinę), który implementuje fabryczny interfejs metody. Metoda fabryki tworzy następnie konkretną instancję związaną z oryginalnym obiektem, bez względu na to, który to jest.
Więc to zwykle prowadzi do użycia obu wzorów razem, gdzie w pierwszym kroku tworzysz jakiś ogólny obiekt, który opisuje rodzinę powiązanych obiektów. Jest wywoływana metodą statyczną getInstance („moje nazwisko”). Implementacja takiej metody getInstance decyduje, który obiekt rodziny zostanie utworzony.
Następnie wywołuję metodę createProduct () na nowo utworzonym obiekcie rodziny i zależnym obiekcie rodziny nowy produkt zostanie zwrócony.
Wydaje się, że te wzorce współpracują ze sobą.
Innymi słowy Fabryka abstrakcyjna skupia się na tym, „CO” zostanie stworzone i metoda Fabryki „JAK” powstanie.
źródło
Musisz tylko pamiętać, że abstrakcyjna fabryka to fabryka, która może zwrócić wiele fabryk . Więc jeśli masz AnimalSpeciesFactory, może zwrócić takie fabryki:
Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Teraz, gdy masz już jedną fabrykę z AnimalSpeciesFactory, używają oni wzorca fabryki do tworzenia określonych obiektów. Na przykład, wyobraź sobie, że masz ReptileFactory z tej AnimalFactory, a następnie możesz zaoferować tworzenie obiektów gadów, takich jak: węże, żółwie, obiekty jaszczurki.
źródło
źródło
Wzorzec metody fabryki to kreacyjny wzorzec projektowy, który zajmuje się tworzeniem obiektów bez pokazywania dokładnej klasy tworzonego obiektu. Ten wzorzec projektowy w zasadzie pozwala klasie odroczyć tworzenie instancji do podklas.
Wzorzec Fabryka abstrakcyjna służy hermetyzacji do grupy pojedynczych fabryk bez ujawniania konkretnych klas. W tym modelu generyczny interfejs abstrakcyjnej klasy fabryki jest używany do tworzenia wymaganego konkretnego obiektu oddzielającego szczegóły implementacji obiektów od ich użycia i składu. Ten wzorzec projektowy jest szeroko stosowany w aplikacjach GUI, w których trzeba utworzyć podobne komponenty GUI.
podczas wyszukiwania w google natknąłem się na blog, który świetnie wyjaśniał oba wzorce projektowe. spójrz na to
http://simpletechtalks.com/factory-design-pattern/
http://simpletechtalks.com/abstract-factory-design-pattern/
źródło