Abstract Factory (Абстрактная фабрика)

Перед прочтением ознакомьтесь с введением в паттерны проектирования.
AbstractFactory относиться к классу порождающих паттернов. Его основное назначение — предоставить интерфейс для создания семейства взаимосвязанных объектов, не специфицируя их классы.

Пример

Предположим, мы создаем некоторую игру-стратегию. Как и в каждой стратегии, здесь будут присутствовать несколько враждующих фракций. Например это будут пришельцы (Alien) и зомби (Zombie). Каждая из «рас», допустим, представлена пехотинцами (footman), транспортом (transport) и боевой техникой (weaponry). Для каждого юнита объявим класс.
[php]
class AlienFootman(){…}
class AlienTransport(){…}
class AlienWeaponry(){…}
class ZombieFootman(){…}
class ZombieTransport(){…}
class ZombieWeaponry(){…}
[/php]
Тогда бой будет напоминать нечто подобное
[php]
$footman_1 = new AlienFootman();
$footman_2 = new ZombieFootman();
// и так для каждого юнита
$footman_1 -> attack($footman_2);
[/php]
В целом неплохо, НО нам пришлось явно использовать имена классов в коде, и пока юнитов всего 3, это не страшно. А если их станет 200 разновидностей для каждой расы? А если добавиться еще 20 рас? То для определения одного пехотинца придется делать цепочку if else (switch) из 4000 ветвлений, что никак не правильно. В таких случаях применяют паттерн «Абстрактная фабрика».

Суть паттерна

Суть абстрактной фабрики заключается в том, чтобы брать обязанность инстанации объекта на себя. Для каждого из семейств объектов (в нашем случае рас), создается конкретная фабрика (наследник абстрактной), посредством которой создаются продукты (в нашем случае юниты) этого семейства.
[php]
$factory_1 = new ZombieFactory();
$factory_2 = new AlienFactory();
// Так как оба пехотинца имеют общий интерфейс, то нам неважно какому классу они принадлежат.
$footman_1 = $factory_1 -> createFootman();
$footman_2 = $factory_2 -> createFootman();
// Мы можем обращаться к ним одинаково
[/php]
Теперь, если мы захотим изменить класс пехотинца на другой, то нам нужно будет его изменить только в фабричном методе.

Материал взят с источника

Leave a Reply