Всъщност има ясно разделение между тези два модела. Общоизвестно е, че и двата шаблона се използват за избягване на зависимости от конкретни типове.
Въпреки това след прочитане
Възникват някои сериозни противоречия:
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