Я знаю, що це питання давнє, але я хотів би додати свої п'ять центів,
Я думаю, що введення залежності (DI) багато в чому схоже на настроюваний заводський зразок (FP), і в цьому сенсі все, що ви могли зробити з DI, ви зможете зробити це з такою фабрикою.
Насправді, якщо ви використовуєте весну, наприклад, у вас є можливість автоматичного підключення ресурсів (DI) або щось подібне:
MyBean mb = ctx.getBean("myBean");
А потім використовуйте цей екземпляр 'mb', щоб зробити що-небудь. Це не дзвінок на завод, який поверне вам екземпляр ??
Єдина реальна відмінність, яку я помічаю між більшістю прикладів FP, полягає в тому, що ви можете налаштувати те, що "myBean" є в xml або в іншому класі, і фреймворк буде працювати як завод, але крім того, що це те саме, і ви може, безумовно, мати Фабрику, яка читає конфігураційний файл або отримує реалізацію у міру необхідності.
І якщо ви запитаєте мене про мою думку (а я знаю, що ви цього не зробили), я вважаю, що DI робить те саме, але лише додає більшої складності розвитку, чому?
ну, з одного боку, щоб ви знали, яка реалізація використовується для будь-яких бобів, які ви автопроводити з DI, вам доведеться перейти до самої конфігурації.
але ... як щодо цієї обіцянки, що вам не доведеться знати впровадження об'єкта, який ви використовуєте? pfft! серйозно? коли ви використовуєте такий підхід ... ви не той самий, що пише реалізацію ?? і навіть якщо ви цього не зробите, чи не ви майже весь час дивитесь на те, як реалізація робить те, що вона повинна робити ??
і для останнього, не важливо, наскільки рамка DI обіцяє вам, що ви будете будувати речі, відокремлені від нього, не залежно від їх класів, якщо ви використовуєте рамку, ви будуєте все наново, якщо вам доведеться змінити підхід чи основу це не буде легким завданням ... ВСЕ! ... але, оскільки ви збираєте все навколо цієї конкретної рамки, а не переживаєте, що найкраще рішення для вашого бізнесу, тоді ви зіткнетеся з проблемою, що склалася.
Насправді, єдиний реальний бізнес-додаток для підходу FP або DI, який я бачу, - це якщо вам потрібно змінити реалізацію, яка використовується під час виконання , але принаймні рамки, які я знаю, не дозволяють вам це зробити, ви повинні залишити все ідеально в конфігурації під час розробки, якщо вам потрібно використовувати інший підхід.
Отже, якщо у мене є клас, який виконує різні дії в двох областях в одній програмі (скажімо, дві компанії холдингу), я повинен налаштувати рамки для створення двох різних бобів і адаптувати свій код для використання кожного. Хіба це не те саме, що якби я просто написав щось подібне:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
те саме, що це:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
І це:
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
У будь-якому випадку вам доведеться щось змінити у вашій програмі, будь то класи чи файли конфігурації, але вам доведеться зробити це повторно.
Не було б непогано зробити щось подібне:
MyBean mb = (MyBean)MyFactory.get("mb");
І таким чином, ви встановлюєте код заводу, щоб отримати правильну реалізацію під час виконання в залежності від зареєстрованого підприємства користувача ?? Тепер це було б корисно. Ви можете просто додати нову банку з новими класами і встановити правила, можливо, навіть під час виконання (або додати новий файл конфігурації, якщо залишити цю опцію відкритою), без змін у існуючих класах. Це була б динамічна фабрика!
Хіба це не буде корисніше, ніж писати дві конфігурації для кожного підприємства, а можливо, навіть мати два різних додатки для кожного ??
Ви можете сказати мені, що мені не потрібно робити комутатор під час виконання, тому я конфігурую додаток, і якщо я успадковую клас або використовую іншу реалізацію, я просто змінюю конфігурацію та повторне розміщення. Гаразд, це теж можна зробити на заводі. І чесно кажучи, скільки разів ти це робиш? можливо, лише якщо у вас є додаток, який буде використовуватися десь у вашій компанії, і ви збираєтеся передати код іншій команді, і вони зроблять такі речі. Але ей, це теж можна зробити з фабрикою, а ще краще з динамічною фабрикою !!
У будь-якому разі, розділ коментарів, якщо він відкритий, ви можете вбити мене.