Паттерн Фабричный метод (Factory Method) на реальном примере

В шаблоне Factory Method классы создателей отделены от продуктов, которые они должны генерировать. Создатель — это класс фабрики, в котором определен метод для генерации объекта-продукта. Если стандартной реализации этого метода не предусмотрено, то создание экземпляров объектов оставляют дочерним классам создателя. Обычно в каждом подклассе создателя создается экземпляр параллельного дочернего класса продукта.

Классы-создатели отражают иерархию продуктов. Это обычный результат, получаемый в результате использования шаблона Factory Method. Некоторые программисты считают этот шаблон особым видом дублирования кода и поэтому часто испытывают к нему антипатию. Другая проблема — шаблон Factory Method часто пособствует ненужному созданию подклассов.

abstract class Creator
{

    abstract public function factoryMethod();

    public function someOperation()
    {
        // Вызываем фабричный метод, чтобы получить объект-продукт.
        $product = $this->factoryMethod();
        // Далее, работаем с этим продуктом.
        $result = "Creator: The same creator's code has just worked with " .
            $product->operation();

        return $result;
    }
}

class Creator1 extends Creator
{
    public function factoryMethod()
    {
        return new Product1();
    }
}

interface Product
{
    public function operation();
}

class Product1 implements Product
{
    public function operation()
    {
        return "{Result of the Product1}";
    }
}

$creator = new Creator1();
echo ($creator->someOperation());

Поэтому, если для генерации подклассов создателя вы планируете применить шаблон Factory Method (и других причин для использования этого шаблона у вас нет!), рекомендуем сначала хорошо подумать. Если же мы немного расширим пример, то столкнемся с новой проблемой. Нам понадобится структура, которая будет работать с множеством связанных реализаций одновременно. Поэтому шаблон Factory Method часто используется вместе с шаблоном Abstract Factory, как мы увидим в следующем разделе.

Фабричный метод отделяет код производства продуктов от остального кода, который эти продукты использует. Благодаря этому, код производства можно расширять, не трогая основной. Так, чтобы добавить поддержку нового продукта, вам нужно создать новый подкласс и определить в нём фабричный метод, возвращая оттуда экземпляр нового продукта.

Добавить комментарий