Простая фабрика

24.09.2012

Следую плану — продолжаем рассматривать паттерны проектирования и на очереди у нас паттерн Фабрика.

Рассмотрим три вариации паттерна:

  1. Простая Фабрика (Simple Factory)
  2. Фабричный метод (Factory Method)
  3. Абстрактная фабрика (Abstract Factory)

Правда сегодня рассмотрим только Простую фабрику, т.к. сев писать статью, понял, что материал достаточно большой.

Продолжение статьи будет на этой неделе.

Исходники - https://github.com/neo-classic/factory

01. Простая фабрика (Simple Factory)

Простая фабрика вообще не является шаблоном проектирования, это скорее идиома программирования (устоявшаяся практика).

Возьмём пример с пицой — есть несколько видов пицы с разной стоимостью и разной начинкой. При заказе мы получаем цену, пускай так:

class Order {
    private $_pizza;

    public function orderPizza($type) {
        switch($type) {
            case 'PizzaEurope':
                $this->_pizza = new PizzaEurope();
                break;
            case 'PizzaItaly':
                $this->_pizza = new PizzaItaly();
                break;
        }
        echo $this->_pizza->getTitle(). ' - ' .$this->_pizza->getCost();
    }
}

Т.е. мы сначала мы создаем объект, а потом получаем его свойства. Давайте инкапсулируем весь switch в отдельный класс — FactoryPizza так:

class FactoryPizza {
    public function create($type) {
        switch($type) {
            case 'PizzaEurope':
                $pizza = new PizzaEurope();
                break;
            case 'PizzaItaly':
                $pizza = new PizzaItaly();
                break;
        }
        return $pizza;
    }
}

И немного исправляем метод orderPizza:

class Order {
    private $_pizza;

    public function orderPizza($type) {
        $pizza = new FactoryPizza();
        $this->_pizza = $pizza->create($type);
        echo $this->_pizza->getTitle(). ' - ' .$this->_pizza->getCost();
    }
}

Давайте проверим как всё работает — index.php:

include("../models/Pizza.php");
include("../models/PizzaEurope.php");
include("../models/PizzaItaly.php");

include("Order.php");

include("FactoryPizza.php");

$order = new Order();
$order->orderPizza('PizzaEurope');

Вот у нас и получилась простая фабрика! Несколько особенностей:

  1. Фабричный класс не должен ничего содержать, кроме создания объектов
  2. Во всем остальном коде мы не должны создавать объекты напрямую, только через фабрику
  3. В фабрике можно использовать статический метод, это избавит от создания объекта фабрики, но помешает дальнейшему наследованию класса.

На этой неделе допишу всё про фабрику, а также в последнее время сразу несколько человек спрашивали про создание отношений MANY_MANY - напишу статью про withRelatedBehavior.

Исходники - https://github.com/neo-classic/factory

Похожие статьи:

blog comments powered by Disqus
Наверх