Статьи

Шаблоны креационного дизайна: абстрактный шаблон фабрики

Шаблон « Абстрактная фабрика» является творческим шаблоном и является одним из самых популярных шаблонов наряду с шаблоном строителя и фабрики. Шаблоны создания используются для создания объектов, а не для создания объектов непосредственно с помощью конструктора.

Шаблон 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, являются их собственными.