Абстрактный шаблон фабрики в Java

Абстрактная фабричная модель на Java

1. обзор

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

В книгеDesign Patterns: Elements of Reusable Object-Oriented Software говорится, что Абстрактная фабрика“provides an interface for creating families of related or dependent objects without specifying their concrete classes”.  Другими словами, эта модель позволяет нам создавать объекты, которые следуют общему шаблону.

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

2. Пример абстрактного шаблона проектирования Factory

В этом примере мы создадим две реализации шаблона Factory Method Design:AnimalFactory иColorFactory..

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

image

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

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

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

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

public class Duck implements Animal {

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

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

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

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

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

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

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

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

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, используя тот же шаблон проектирования.

Когда все это установлено, мы создадим классFactoryProvider, который предоставит нам реализациюAnimalFactory или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. Когда использовать абстрактный заводской шаблон:

  • Клиент не зависит от того, как мы создаем и компонуем объекты в системе

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

  • Нам нужно значение времени выполнения для построения конкретной зависимости

While the pattern is great when creating predefined objects, adding the new ones might be challenging. Для поддержки нового типа объектов потребуется изменить классAbstractFactory и все его подклассы.

4. Резюме

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

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