Шаблон « Абстрактная фабрика» является творческим шаблоном и является одним из самых популярных шаблонов наряду с шаблоном строителя и фабрики. Шаблоны создания используются для создания объектов, а не для создания объектов непосредственно с помощью конструктора.
Шаблон Abstract Factory предоставляет способ инкапсулировать группу отдельных фабрик, имеющих общую тему, без указания их конкретных классов.
Цель использования шаблона состоит в том, чтобы изолировать создание объектов от их использования и создать семейства связанных объектов без необходимости зависеть от их конкретных классов.
Используя этот шаблон, клиент не должен знать об объектах и деталях их реализации. Ответственность за реализацию объектов и обработку всех деталей лежит на Реализации абстрактной фабрики, чтобы сделать это успешно.
  Итак, давайте приступим к действиям и начнем решать проблемы. 
  Предположим, мы несем ответственность за процесс консервирования различных продуктов. 
  Что касается процедуры консервирования, есть два объекта, которые должны быть созданы.  Основная часть банки и верхняя часть банки. 
  Кроме того, учитывая тот факт, что у нас могут быть различные формы консервирования, у нас также могут быть различные фабрики, которые могут обрабатывать процесс консервирования.  Например, у нас может быть завод по производству пива или завод по производству пищевых продуктов. 
Что касается приведенного выше описания, кажется, что абстрактная фабрика — это путь. У нас есть семейство объектов, и мы хотим скрыть конструкцию этих объектов.
Мы начнем с добавления двух интерфейсов, касающихся функциональности верхней части банки и корпуса банки.
| 1 2 3 4 5 6 7 | packagecom.gkatzioura.design.creational.abstractfactory;publicinterfaceCanTop {    voidopen();} | 
| 1 2 3 4 5 6 7 | packagecom.gkatzioura.design.creational.abstractfactory;publicinterfaceCanBody {    voidfill();} | 
Затем мы создадим абстрактную фабрику, которая предоставит методы для реализации для создания этих объектов.
| 1 2 3 4 5 6 7 8 9 | packagecom.gkatzioura.design.creational.abstractfactory;publicabstractclassCanningFactory {    publicabstractCanTop createTop();    publicabstractCanBody createBody();} | 
Как уже упоминалось, у нас есть случаи консервирования пива. Таким образом, у нас будут реализации класса CanTop и CanBody.
| 01 02 03 04 05 06 07 08 09 10 | packagecom.gkatzioura.design.creational.abstractfactory.beer;importcom.gkatzioura.design.creational.abstractfactory.CanTop;publicclassBeerCanTop implementsCanTop {    publicvoidopen() {    }} | 
| 01 02 03 04 05 06 07 08 09 10 | packagecom.gkatzioura.design.creational.abstractfactory.beer;importcom.gkatzioura.design.creational.abstractfactory.CanBody;publicclassBeerCanBody implementsCanBody {    publicvoidfill() {    }} | 
Затем мы внедрим пивоваренный завод.
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | packagecom.gkatzioura.design.creational.abstractfactory.beer;importcom.gkatzioura.design.creational.abstractfactory.CanBody;importcom.gkatzioura.design.creational.abstractfactory.CanTop;importcom.gkatzioura.design.creational.abstractfactory.CanningFactory;publicclassBeerCanningFactory extendsCanningFactory {    publicCanTop createTop() {        returnnewBeerCanTop();    }    publicCanBody createBody() {        returnnewBeerCanBody();    }} | 
Другой случай — консервирование еды. Мы также предоставим реализации классов CanTop и CanBody для этого случая.
| 01 02 03 04 05 06 07 08 09 10 | packagecom.gkatzioura.design.creational.abstractfactory.food;importcom.gkatzioura.design.creational.abstractfactory.CanBody;publicclassFoodCanBody implementsCanBody {    publicvoidfill() {    }} | 
| 01 02 03 04 05 06 07 08 09 10 | packagecom.gkatzioura.design.creational.abstractfactory.food;importcom.gkatzioura.design.creational.abstractfactory.CanTop;publicclassFoodCanTop implementsCanTop {    publicvoidopen() {    }} | 
В качестве последнего шага мы представим абстрактную фабричную реализацию для случаев консервирования пищевых продуктов.
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | packagecom.gkatzioura.design.creational.abstractfactory.food;importcom.gkatzioura.design.creational.abstractfactory.CanBody;importcom.gkatzioura.design.creational.abstractfactory.CanTop;importcom.gkatzioura.design.creational.abstractfactory.CanningFactory;publicclassFoodCanningFactory extendsCanningFactory {    publicCanTop createTop() {        returnnewFoodCanTop();    }    publicCanBody createBody() {        returnnewFoodCanBody();    }} | 
Мы только что использовали абстрактный шаблон фабрики, чтобы создать семейство объектов, относящихся к процессу консервирования. Мы изолировали процесс создания от использования CanTop и CanBody. Также мы можем создавать семейство объектов независимо от их конкретных классов.
Вы можете найти исходный код на github .
В следующем сообщении мы рассмотрим фабричный шаблон.
  Также я собрал шпаргалку, содержащую сводку шаблонов креационного дизайна. 
  Зарегистрируйтесь в ссылке, чтобы получить его. 
| Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG.  См. Оригинальную статью здесь: Шаблоны креационного дизайна: Абстрактный шаблон фабрики Мнения, высказанные участниками Java Code Geeks, являются их собственными. |