Wiem, że to pytanie jest stare, ale chciałbym dodać moje pięć centów,
Myślę, że wstrzykiwanie zależności (DI) jest pod wieloma względami konfigurowalnym wzorcem fabrycznym (FP) iw tym sensie wszystko, co można zrobić z DI, będzie w stanie zrobić z taką fabryką.
W rzeczywistości, jeśli na przykład używasz sprężyny, masz opcję automatycznego zasilania (DI) lub robienia czegoś takiego:
MyBean mb = ctx.getBean("myBean");
A następnie użyj tego wystąpienia „mb”, aby cokolwiek zrobić. Czy to nie jest wezwanie do fabryki, która zwróci ci instancję?
Jedyną prawdziwą różnicą, którą zauważam między większością przykładów FP, jest to, że możesz skonfigurować, co „myBean” znajduje się w xml lub w innej klasie, a framework będzie działał jak fabryka, ale poza tym jest to to samo, a ty może mieć z pewnością Fabrykę, która czyta plik konfiguracyjny lub pobiera implementację zgodnie z potrzebami.
A jeśli zapytasz mnie o moją opinię (i wiem, że nie), wierzę, że DI robi to samo, ale tylko zwiększa złożoność rozwoju, dlaczego?
Cóż, po pierwsze, aby wiedzieć, jaka implementacja jest używana dla dowolnego komponentu bean, którego używasz automatycznie w DI, musisz przejść do samej konfiguracji.
ale ... co z obietnicą, że nie będziesz musiał znać implementacji obiektu, którego używasz? pfft! poważnie? kiedy zastosujesz takie podejście ... czy nie jesteś tym samym, który pisze implementację? a nawet jeśli nie, to czy nie prawie cały czas patrzysz, jak implementacja robi to, co powinna?
i na koniec, nie ma znaczenia, ile framework DI obiecuje ci, że będziesz budował rzeczy od niego niezwiązane , bez zależności od ich klas, jeśli używasz frameworka, budujesz wszystko na nim, jeśli musisz zmień podejście lub ramy, to nie będzie łatwe zadanie ... KIEDYKOLWIEK! ... ale ponieważ budujesz wszystko wokół tego konkretnego środowiska, zamiast martwić się o najlepsze rozwiązanie dla Twojej firmy, staniesz przed poważnym problemem.
W rzeczywistości jedyną prawdziwą aplikacją biznesową dla podejścia FP lub DI, którą widzę, jest konieczność zmiany implementacji używanych w środowisku wykonawczym , ale przynajmniej znane mi ramy nie pozwalają na to, musisz odejść wszystko idealne w konfiguracji w czasie programowania i jeśli potrzebujesz, użyj innego podejścia.
Tak więc, jeśli mam klasę, która działa w różny sposób w dwóch zakresach w tej samej aplikacji (powiedzmy, dwie firmy holdingu), muszę skonfigurować strukturę, aby utworzyć dwie różne komponenty i dostosować mój kod, aby z nich korzystać. Czy to nie to samo, gdybym napisał coś takiego:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
tak samo jak to:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
I to:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
W każdym razie będziesz musiał coś zmienić w swojej aplikacji, czy to w klasach, czy w plikach konfiguracyjnych, ale musisz to zrobić ponownie.
Czy nie byłoby miło zrobić coś takiego:
MyBean mb = (MyBean)MyFactory.get("mb");
I w ten sposób ustawiasz kod fabryki, aby uzyskać właściwą implementację w czasie wykonywania w zależności od zalogowanego przedsiębiorstwa użytkownika? Teraz to byłoby pomocne. Możesz po prostu dodać nowy jar z nowymi klasami i ustawić reguły, może nawet w czasie wykonywania (lub dodać nowy plik konfiguracyjny, jeśli pozostawisz tę opcję otwartą), bez zmian w istniejących klasach. To byłaby fabryka dynamiczna!
czy nie byłoby to bardziej pomocne niż konieczność napisania dwóch konfiguracji dla każdego przedsiębiorstwa, a może nawet posiadania dwóch różnych aplikacji dla każdego?
Możesz mi powiedzieć, że nie muszę nigdy zmieniać przełącznika w czasie wykonywania, więc konfiguruję aplikację, a jeśli odziedziczę klasę lub użyję innej implementacji, po prostu zmieniam konfigurację i wdrożyłem ponownie. Ok, można to również zrobić w fabryce. I szczerze mówiąc, ile razy to robisz? może tylko wtedy, gdy masz aplikację, która będzie używana gdzie indziej w Twojej firmie, i przekażesz kod innemu zespołowi, a oni zrobią takie rzeczy. Ale hej, można to również zrobić w fabryce, a byłoby jeszcze lepiej w dynamicznej fabryce !!
W każdym razie sekcja komentarzy, jeśli jesteś otwarta, aby mnie zabić.