И так, если вы видели
группы паттернов проектирования, первый у нас по счету идет шаблон проектирования
"Абстрактная фабрика". Постараюсь "просто, о сложном". Примеры приводить не стану, их и так полно - взять любую более-менее серьезную библиотеку.
При рассмотрении порождающих паттернов, обычно используется такое понятие как — объекты-продукты . Фабрика должна иметь операции, которые создают новые объекты, иначе это не фабрика, и эти самые возвращаемые фабрикой объекты, называют продуктами.
Вообще сама по себе абстрактная фабрика содержит только интерфейс для операций создающих объекты, работа с этим паттерном заключается в создании конкретных фабрик, которые будут реализовывать эти интерфейсы. Если пойти дальше, то зачастую для достижения большей гибкости, требуется так же писать абстрактные классы и для объектов-продуктов.
Если собрать все в кучу, то при разработке мы должны создать:
- абстрактный класс — фабрику;
- абстрактные классы — объекты, которые она будет создавать (это может быть и один объект);
- написать уже конкретный класс(-ы), который(-ые) будет(-ут) реализовывать методы и/или дополнять их, это будут фабрики производящие семейства объектов;
- создать реальные классы продуктов (в некоторых случаях они могут быть пустыми и наследовать функционал от своих абстрактных родителей);
Первые два пункта относятся к проектированию, следующие уже к разработке. Вообще главное потрудиться над проектированием, что бы получить должный эффект от любого паттерна.
Что мы получим в итоге? На тот момент, когда будет много кода и реализованного функционала в целом по приложению — можно будет переключаться между фабриками и получать различные семейства объектов, это достигается тем, что программа (или скрипт) пользуется абстрактными методами фабрики, а в них инкапсулирована работа с классами продуктов.