Задать вопрос
@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());


И класс фабрики не потребуется
  • Вопрос задан
  • 7299 просмотров
Подписаться 8 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽