Различава ли се моделът Service Locator от шаблона Abstract Factory?

На пръв поглед моделът Service Locator ми изглежда същия като модела Abstract Factory. Изглежда, че и двете имат една и съща употреба (отправяте запитване към тях, за да получат екземпляри на абстрактни услуги) и двете бяха споменати, когато прочетох за инжектиране на зависимости.

Обаче виждах модела за локатор на услуги описан като лоша идея, но видях директна поддръжка за модела Abstract Factory в поне една основна рамка за инжектиране на зависимости.

Ако не са еднакви, какви са разликите?


person Merlyn Morgan-Graham    schedule 18.04.2011    source източник
comment
възможен дубликат на Dependency Injection vs Factory Pattern   -  person Juliet    schedule 18.04.2011
comment
@Juliet: Нито Service Locator, нито Abstract Factory са инжектиране на зависимости. DI е модел за натискане, докато фабриките и локаторите на услуги са модел за изтегляне. И да, предпочитам DI+IoC пред локатора на услуги - просто искам да разбера локатора на услуги. Не се противопоставям на намирането на действителен дубликат, но :) Можете ли да добавите отново тази публикация в блога, която оставихте предварителна редакция?   -  person Merlyn Morgan-Graham    schedule 18.04.2011
comment
Ето го: kill-0.com/duplo/2010/02/05/ . Изглежда не сте единственият, който се чуди каква е разликата между Service Locator и Abstract Factory моделите :)   -  person Juliet    schedule 18.04.2011


Отговори (4)


Попаднах на същия въпрос, докато проучвах тези модели. Мисля, че основните разлики могат да бъдат намерени между локатор на услуги и фабрика (независимо дали е абстрактен или не):

Локатор на услуги

  • „Намира“ съществуваща зависимост (услугата). Въпреки че услугата може да бъде създадена по време на преобразуване, това няма значение за Клиента, защото:
  • Клиентът на Service Locator НЕ поема собственост върху зависимостта.

Фабрика

  • Създава нов екземпляр на зависимост.
  • Клиентът на фабриката поема собственост върху зависимостта.

Абстрактна фабрика

  • Същото като обикновената фабрика, с изключение на това, че различните внедрявания могат да използват различни реализации на абстрактната фабрика, което позволява различни типове да бъдат инстанцирани в тези различни внедрявания (можете дори да промените реализацията на абстрактната фабрика по време на изпълнение, но обикновено не се използва така.)
person Gyan aka Gary Buyn    schedule 22.02.2012
comment
+1; Добра точка, че целта е различна. Предположих, че това ще бъде очевидно от имената на моделите, така че се съсредоточих върху механиката и публичния интерфейс, а не върху намерението за използване. Това разграничение е доста важно по отношение на жизнения цикъл на обектите, върнати от двата класа. - person Merlyn Morgan-Graham; 23.02.2012
comment
Мисля, че намерението е определяща характеристика на модела. Например декораторът и проксито могат да бъдат внедрени по един и същи начин, но имат различни намерения. - person Gyan aka Gary Buyn; 23.02.2012
comment
Приемам вашия отговор в полза на моя, защото намерението на модела е по-важно от това как интерфейсът поддържа това намерение. - person Merlyn Morgan-Graham; 31.03.2013
comment
Моля, дайте примерни кодове в подкрепа на това, което казахте. Това би го направило много по-лесно за разбиране - person Adi; 26.06.2018

От това, което прочетох досега, мисля, че разликата е:

Моделът за локатор на услуги

  • Изрично поддържа регистрация на това кои конкретни обекти трябва да бъдат създадени/върнати
  • Обикновено има общ интерфейс, позволяващ на потребителя да поиска всеки абстрактен тип, а не конкретни типове
  • Самата тя може да бъде бетон

Моделът на абстрактната фабрика

  • Може да не поддържа регистрация - това зависи от конкретната реализация, която да поддържа или да не поддържа, и вероятно няма да бъде изложено в абстрактния интерфейс
  • Обикновено има множество методи за получаване за конкретни абстрактни типове
  • Сам по себе си не е конкретен (въпреки че разбира се ще има конкретни реализации)
person Merlyn Morgan-Graham    schedule 18.04.2011
comment
Не съм положителен в отговора си, защото нямам много опит с модела Service Locator. Ако някой иска да допринесе с по-информиран отговор, не се колебайте. - person Merlyn Morgan-Graham; 25.04.2011
comment
Вече се чувствам много по-комфортно с тези концепции. Моят отговор е правилен, но това е половината от историята. Намерението е по-важно. Вижте този друг отговор на въпроса - stackoverflow.com/a/9403827/232593 (също: препоръчвам да не използвате DI контейнер, освен за внедряване на плъгин архитектура. Използвайте ръчно инжектиране на конструктор в рамките на вашето приложение, с фабрики, където имате нужда от тях, или притежаващ модул, за да се свържете с наистина ненадеждна услуга вашата програма ще притежава и има пълен контрол върху гарантирането, че е там). - person Merlyn Morgan-Graham; 26.09.2016

Всъщност има ясно разделение между тези два модела. Общоизвестно е, че и двата шаблона се използват за избягване на зависимости от конкретни типове.

Въпреки това след прочитане

  • Разработка на гъвкав софтуер, принципи, модели и практики [книга] от Rober C. Martin
  • Инверсия на контролни контейнери и модел на инжектиране на зависимости [статия] от Мартин Фаулър на http://martinfowler.com/articles/injection.html
  • Разпознаване на образи: абстрактна фабрика или локатор на услуги? [статия] от Mark Seemann в http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
  • Design Pattern [книга] от Ерих Гама и др

Възникват някои сериозни противоречия:

Seemann каза: „Абстрактната фабрика е общ тип и типът на връщане на метода Create се определя от типа на самата фабрика. С други думи, конструираният тип може да върне само екземпляри от един тип.“

Докато Rober C. Martin не спомена нищо за генеричните типове и освен това, фабричните примери в неговата книга позволяват да се създаде екземпляр на повече от един тип обекти, които се разграничават, като се използва ключов низ като параметър във Factory.Make().

Gamma каза, че намерението на Abstract Factory е да „предостави интерфейс за създаване на семейства от свързани или зависими обекти, без да посочва техните конкретни класове“. Струва си да се спомене, че примерът на Gamma Abstract Factory нарушава принципа за разделяне на интерфейса (ISP), заявен от Мартин. ISP и SOLID като цяло са по-модерни принципи или може би за простота, където са пропуснати.

Работите на Гама и Мартин предхождат тези на Зееман, така че мисля, че той трябва да следва вече дадената дефиниция.

Докато Fowler предлага Service Locator като начин за прилагане на инверсия на зависимостите, Seemann го смята за анти-модел. Нито Gamma, нито Martin споменават Service Locator.

Въпреки това Seemann и Fowler се съгласиха, че Service Locator се нуждае от стъпка за конфигуриране, за да регистрира екземпляр на бетонен клас, този екземпляр ще бъде върнат по-късно, когато бъде поискан обект от този вид. Тази стъпка на конфигуриране не се споменава от Martin или Gamma в тяхната дефиниция на Abstract Factory. Моделът на абстрактната фабрика предполага, че нов обект се инстанцира всеки път, когато се поиска обект от този вид.

Заключение

Основната разлика между Service Locator и Abstract Factory е, че Abstract Factory предполага, че нов обект се инстанцира и връща при всяка заявка, а Service Locator трябва да бъде конфигуриран с екземпляр на обект и всеки път, когато същият екземпляр ще бъде върнат.

person jfuentes    schedule 08.02.2015
comment
Съгласен съм, че понятието на Seemann за Abstract Factory не отговаря на определението на GoF; но защо казвате, че определението на GoF нарушава ISP? Намерението е всеки клиент да използва всеки фабричен метод. - person jaco0646; 09.08.2016

От: http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/

Абстрактната фабрика е общ тип и типът на връщане на метода Create се определя от типа на самата фабрика. С други думи, конструиран тип може да върне само екземпляри от един тип.

Локаторът на услуги, от друга страна, е негенеричен интерфейс с общ метод. Методът Create на единичен Service Locator може да върне екземпляри от безкраен брой типове.

person John Smith    schedule 06.03.2016