Рубрики
Без рубрики

Абстрактный фабричный паттерн в Java

Поймите абстрактный шаблон проектирования фабрики вместе с его реализацией на Java.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы обсудим абстрактный шаблон проектирования фабрики.

В книге Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения говорится, что Абстрактная фабрика “предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов”. Другими словами, эта модель позволяет нам создавать объекты, которые следуют общему шаблону.

Примером абстрактного шаблона проектирования фабрики в JDK является newInstance() of javax.xml.parsers.DocumentBuilderFactory класс.

2. Пример Абстрактного Заводского Дизайна

В этом примере мы создадим две реализации шаблона проектирования фабричного метода: Animal Factory и Color Factory.

После этого мы будем управлять доступом к ним с помощью абстрактной фабрики Abstract Factory:

Сначала мы создадим семейство класса Animal и позже будем использовать его в нашей Абстрактной фабрике.

Вот интерфейс Animal :

public interface Animal {
    String getAnimal();
    String makeSound();
}

и конкретная реализация Утка :

public class Duck implements Animal {

    @Override
    public String getAnimal() {
        return "Duck";
    }

    @Override
    public String makeSound() {
        return "Squeks";
    }
}

Кроме того, мы можем создать более конкретные реализации интерфейса Animal (например, Dog, Bear, etc.) Именно таким образом.

Абстрактная фабрика имеет дело с семействами зависимых объектов. Имея это в виду, мы собираемся представить еще одно семейство Color в качестве интерфейса с несколькими реализациями ( White, Brown,… ).

Мы пока пропустим сам код, но его можно найти здесь .

Теперь, когда у нас есть несколько готовых семейств, мы можем создать для них Абстрактную фабрику интерфейс:

public interface AbstractFactory {
    T create(String animalType) ;
}

Затем мы реализуем Animal Factory , используя шаблон проектирования заводского метода, который мы обсуждали в предыдущем разделе:

public class AnimalFactory implements AbstractFactory {

    @Override
    public Animal create(String animalType) {
        if ("Dog".equalsIgnoreCase(animalType)) {
            return new Dog();
        } else if ("Duck".equalsIgnoreCase(animalType)) {
            return new Duck();
        }

        return null;
    }

}

Аналогично, мы можем реализовать фабрику для интерфейса Color , используя тот же шаблон проектирования.

Когда все это будет установлено, мы создадим класс Factory Provider , который предоставит нам реализацию Animal Factory или ColorFactory в зависимости от аргумента, который мы передадим методу getFactory() :

public class FactoryProvider {
    public static AbstractFactory getFactory(String choice){
        
        if("Animal".equalsIgnoreCase(choice)){
            return new AnimalFactory();
        }
        else if("Color".equalsIgnoreCase(choice)){
            return new ColorFactory();
        }
        
        return null;
    }
}

3. Когда использовать Абстрактный Заводской шаблон:

  • Клиент не зависит от того, как мы создаем и составляем объекты в системе
  • Система состоит из нескольких семейств объектов, и эти семейства предназначены для совместного использования
  • Нам нужно значение времени выполнения, чтобы построить определенную зависимость

В то время как шаблон отлично подходит для создания предопределенных объектов, добавление новых может быть сложным . Для поддержки нового типа объектов потребуется изменение класса Abstract Factory и всех его подклассов.

4. Резюме

В этой статье мы узнали об абстрактном фабричном шаблоне проектирования.

Наконец, как всегда, реализацию этих примеров можно найти на GitHub .