Паттерн проектирования Abstract Factory

Согласно Википедии, абстрактная фабрика является порождающим шаблоном проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Этот шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (к примеру, для оконного интерфейса он способен создавать окна и кнопки). Потом пишутся классы, реализующие этот интерфейс.

Да, определение весьма ёмкое, но сложное для понимания. Упростим ситуацию. Давайте представим, что у нас есть коттедж, и нам нужно заказать двери, при этом разные. Деревянную дверь мы закажем в одном магазине, железную — в другом, пластиковую — в третьем. Для изготовления этих дверей понадобятся разные специалисты: столяр — для первой, электрогазосварщик — для второй и т. д. То есть налицо зависимость между дверьми.

Говоря простыми словами, Abstract Factory — это фабрика фабрик, то есть фабрика, группирующая индивидуальные, но при этом связанные/зависимые фабрики, не указывая их конкретных классов.

Напишем соответствующий код на PHP 7. Поначалу у нас присутствует интерфейс Door и несколько его реализаций:

Также для каждого типа дверей у нас есть специалисты DoorFittingExpert :

Итак, теперь в нашем распоряжении DoorFactory, которая позволит создать целое семейство связанных объектов. Та же фабрика деревянных дверей предоставит и деревянную дверь, и соответствующего эксперта. То же самое и для железных дверей:

А теперь рассмотрим пример использования:

Можно заметить, что фабрика по производству деревянных дверей инкапсулирует столяра и деревянную дверь, в то время как фабрика по производству железных дверей инкапсулирует и железную дверь, и сварщика. Всё это позволит нам убедиться в том, что мы получим для каждой двери нужного специалиста.

Таким образом, Abstract Factory используется в тех случаях, когда у нас есть взаимосвязанные зависимости с не самой простой логикой создания. Если интересует, можете посмотреть соответствующие примеры реализации на Java.

По материалам статьи «Design Patterns for Humans».