Шаблон « Абстрактная фабрика» является творческим шаблоном и является одним из самых популярных шаблонов наряду с шаблоном строителя и фабрики. Шаблоны создания используются для создания объектов, а не для создания объектов непосредственно с помощью конструктора.
Шаблон Abstract Factory предоставляет способ инкапсулировать группу отдельных фабрик, имеющих общую тему, без указания их конкретных классов.
Цель использования шаблона состоит в том, чтобы изолировать создание объектов от их использования и создать семейства связанных объектов без необходимости зависеть от их конкретных классов.
Используя этот шаблон, клиент не должен знать об объектах и деталях их реализации. Ответственность за реализацию объектов и обработку всех деталей лежит на Реализации абстрактной фабрики, чтобы сделать это успешно.
Итак, давайте приступим к действиям и начнем решать проблемы.
Предположим, мы несем ответственность за процесс консервирования различных продуктов.
Что касается процедуры консервирования, есть два объекта, которые должны быть созданы. Основная часть банки и верхняя часть банки.
Кроме того, учитывая тот факт, что у нас могут быть различные формы консервирования, у нас также могут быть различные фабрики, которые могут обрабатывать процесс консервирования. Например, у нас может быть завод по производству пива или завод по производству пищевых продуктов.
Что касается приведенного выше описания, кажется, что абстрактная фабрика — это путь. У нас есть семейство объектов, и мы хотим скрыть конструкцию этих объектов.
Мы начнем с добавления двух интерфейсов, касающихся функциональности верхней части банки и корпуса банки.
1
2
3
4
5
6
7
|
package com.gkatzioura.design.creational.abstractfactory; public interface CanTop { void open(); } |
1
2
3
4
5
6
7
|
package com.gkatzioura.design.creational.abstractfactory; public interface CanBody { void fill(); } |
Затем мы создадим абстрактную фабрику, которая предоставит методы для реализации для создания этих объектов.
1
2
3
4
5
6
7
8
9
|
package com.gkatzioura.design.creational.abstractfactory; public abstract class CanningFactory { public abstract CanTop createTop(); public abstract CanBody createBody(); } |
Как уже упоминалось, у нас есть случаи консервирования пива. Таким образом, у нас будут реализации класса CanTop и CanBody.
01
02
03
04
05
06
07
08
09
10
|
package com.gkatzioura.design.creational.abstractfactory.beer; import com.gkatzioura.design.creational.abstractfactory.CanTop; public class BeerCanTop implements CanTop { public void open() { } } |
01
02
03
04
05
06
07
08
09
10
|
package com.gkatzioura.design.creational.abstractfactory.beer; import com.gkatzioura.design.creational.abstractfactory.CanBody; public class BeerCanBody implements CanBody { public void fill() { } } |
Затем мы внедрим пивоваренный завод.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package com.gkatzioura.design.creational.abstractfactory.beer; import com.gkatzioura.design.creational.abstractfactory.CanBody; import com.gkatzioura.design.creational.abstractfactory.CanTop; import com.gkatzioura.design.creational.abstractfactory.CanningFactory; public class BeerCanningFactory extends CanningFactory { public CanTop createTop() { return new BeerCanTop(); } public CanBody createBody() { return new BeerCanBody(); } } |
Другой случай — консервирование еды. Мы также предоставим реализации классов CanTop и CanBody для этого случая.
01
02
03
04
05
06
07
08
09
10
|
package com.gkatzioura.design.creational.abstractfactory.food; import com.gkatzioura.design.creational.abstractfactory.CanBody; public class FoodCanBody implements CanBody { public void fill() { } } |
01
02
03
04
05
06
07
08
09
10
|
package com.gkatzioura.design.creational.abstractfactory.food; import com.gkatzioura.design.creational.abstractfactory.CanTop; public class FoodCanTop implements CanTop { public void open() { } } |
В качестве последнего шага мы представим абстрактную фабричную реализацию для случаев консервирования пищевых продуктов.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package com.gkatzioura.design.creational.abstractfactory.food; import com.gkatzioura.design.creational.abstractfactory.CanBody; import com.gkatzioura.design.creational.abstractfactory.CanTop; import com.gkatzioura.design.creational.abstractfactory.CanningFactory; public class FoodCanningFactory extends CanningFactory { public CanTop createTop() { return new FoodCanTop(); } public CanBody createBody() { return new FoodCanBody(); } } |
Мы только что использовали абстрактный шаблон фабрики, чтобы создать семейство объектов, относящихся к процессу консервирования. Мы изолировали процесс создания от использования CanTop и CanBody. Также мы можем создавать семейство объектов независимо от их конкретных классов.
Вы можете найти исходный код на github .
В следующем сообщении мы рассмотрим фабричный шаблон.
Также я собрал шпаргалку, содержащую сводку шаблонов креационного дизайна.
Зарегистрируйтесь в ссылке, чтобы получить его.
Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: Шаблоны креационного дизайна: Абстрактный шаблон фабрики
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |