@isawillbenice

Паттерн фабрика PHP, в чем суть?

Прочитав о паттерне фабрика возникло некое недопонимание
habrahabr.ru/post/214285 - в статье описывается реализация паттерна

не очень понимаю зачем делать

$factory = new FirstFactory();
$firstProduct = $factory->getProduct();
$factory = new SecondFactory();
$secondProduct = $factory->getProduct();

print_r($firstProduct->getName());
print_r($secondProduct->getName());


когда я могу не вызывая new FirstFactory();
сразу вызвать new FirstProduct();

interface Product
{
    public function getName();
}

class FirstProduct implements Product
{
    public function getName()
    {
        return 'The first product';
    }
}

$firstProduct = new FirstProduct();
print_r($firstProduct->getName());


И класс фабрики не потребуется
  • Вопрос задан
  • 7277 просмотров
Решения вопроса 1
jakulov
@jakulov
Фабрика позволят избавиться в коде от прямой зависимости от конкретного класса – это её основная суть. Иногда это удобно, приведу такой пример:
Есть некий класс, отвечающий за процессинг платежей PaymentManager. Вы используете фабрику, получая его и сразу передавая ему заказ:
$manager = PaymentFactory::getManager($order)
Тут ваш заказчик говорит, что теперь заказы суммой меньше 10 тыс руб должны направляться на другой платежный сервис. Можно, конечно переписать старый менеджер платежей, а можно добавить новый AlternatePaymentManager. при этом весь код, работающий с платежами остается неизменным, только в фабрике добавлям:
public static function getManager($order)
{
   if($order['total'] >= 10000) {
    return new PaymentManager($order); 
  }
  else {
    return new AlternatePaymentManager($order);
  }
}


Такие примеры часто возникают в реальных приложениях, их можно прочувствовать заранее при написании кода. Плюс еще можно добиться выгоды и при написании тестов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
в фабрике нужен ещё фабричный метод

class ProductManager
{
    public static create($productName)
    {
         $object = ucfirst($productName).'Product';
         return new $product();
    }
}

$product = ProductManager::create('first');
$product->getName();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы