Фабричный метод в PHP

В паттерне фабричного метода у нас есть интерфейс, который реализует «основы», которыми должны обладать ваши объекты.

Это еще один паттерн проектирования GOF, в котором мы фокусируемся на интерфейсе, оставляя ответственность за реализацию за каждым конкретным объектом.

Практическим примером может служить определение типов платежей, существует бесконечное множество типов и способов совершения платежа, но мы можем свести их к некоторым общим пунктам:

Каждый платеж имеет сумму, валюту (доллар, реал), процент, рассрочку и т.д. Затем мы могли бы иметь PaymentProduct с этими методами, а каждый метод оплаты должен реализовать эти методы и определить свои правила.

В Golang широко используется «интерфейсно-ориентированное программирование», когда для тестирования объектов нам сначала нужен интерфейс, моделирующий их поведение.

CarProduct.php:

<?php

namespace FactoryMethodProduct;

// Todos os subprodutos de um carro, precisam implementar os métodos desta interface
interface CarroProduct
{
    public function acelerar(): void;
    public function frear(): void;
    public function trocarMarcha(): void;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Внутри этого файла, чтобы уменьшить количество файлов, я создал 2 разных класса, реализующих наш интерфейс: TeslaModel и VW Beetle. Эти два объекта являются нашими «конкретными» объектами, реализующими модель (интерфейс).

// Concrete product, ou seja, um objeto concreto que implementa a interface
class TeslaModel implements CarroProduct
{
    public function acelerar(): void
    {
        echo "Tesla acelerandon";
    }

    public function frear(): void
    {
        echo "Tesla freandon";
    }

    public function trocarMarcha(): void
    {
        echo "Tesla trocando marcha";
    }
}

// Concrete product, ou seja, um objeto concreto que implementa a interface
class Fusca implements CarroProduct
{
    public function acelerar(): void
    {
        echo "Fusca acelerandon";
    }

    public function frear(): void
    {
        echo "Fusca freandon";
    }

    public function trocarMarcha(): void
    {
        echo "Fusca trocando marcha";
    }
}

Войдите в полноэкранный режим Выход из полноэкранного режима

Теперь мы создаем еще один интерфейс, на этот раз тот, который будет отвечать за управление созданием наших объектов, то есть интерфейс, отвечающий за определение нашей фабрики.

CarroFactory.php:

<?php

use FactoryMethodProductCarroProduct;

// A carro factory, permite que a gente crie qualquer objeto concreto que implemente a interface CarroProduct
interface CarroFactory 
{
    public function criarCarro(string $modeloDoCarro) : CarroProduct;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Мы будем использовать класс CarProduct, поскольку наша фабрика будет отвечать за создание объектов типа CarProduct, другими словами, любого класса, реализующего наш интерфейс.

Теперь мы создадим 2 класса FuscaFactory и TeslaFactory, которые будут ответственными классами для создания нашего VW Beetle и нашей Tesla.

<?php

use FactoryMethodProductCarroProduct;
use FactoryMethodProductFusca;

class FuscaFactory implements CarroFactory 
{
    public function criarCarro(string $modeloDoCarro): CarroProduct
    {
        if ($modeloDoCarro == "fusca")
        {
            return new Fusca();
        } else {
            throw new Exception("Modelo de carro invalido!");
        }
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Наконец, наш индекс:


<?php

/**
 * 
 * No padrão Factory Method, temos uma interface que define
 *um contrato para os objetos a serem criados pelas fábricas, que
 *seriam nossos produtos finais. Também temos uma interface que
 *define como nossas classes-fábrica deverão ser construídas.
 * 
 * 
 */

 $teslaFactory = new TeslaFactory();
 $fuscaFactory = new FuscaFactory();

 try 
 {
    $teslas = $teslaFactory->criarCarro('modeloX');
 } 
 catch(Exception $e)
 { 
    echo $e->getMessage();
 }

 $teslas->acelerar();
 $teslas->trocarMarcha();
 $teslas->frear();

Войдите в полноэкранный режим Выход из полноэкранного режима

Короче говоря, метод фабрики очень полезен, когда нам нужно создать несколько объектов, которые будут иметь схожее поведение. Конечно, это не совсем практический пример, но, например, если бы это был реальный производитель автомобилей, представьте, сколько существует моделей автомобилей.

Оцените статью
devanswers.ru
Добавить комментарий