팩토리 메소드 com PHP

팩토리 메서드를 사용하지 않고 인터페이스를 구현하거나 '기본'으로 전환할 수 있는 개체를 사용할 수 있습니다.

Este é mais um padrão de projeto do GOF, onde programamos voltados a interface, deixando a responsabilidade de implementação especificos para cada objeto specific.

Um exemplo prático seria definirmos tipos de pagamentos, existem infinitos tipos e formas de realizarmos um pagamento, mas podemos resumi-los a alguns itens em comum:

Todo pagamento tem um valor, a moeda(달러, 레알), juros, 소포 등. Poderiamos ter então uma PagamentoProduct com esses métodos, e cada forma de pagamento deverá implementar esses métodos e definir suas regras.

A 'programação voltada a interface'é muito utilizado em Golang, onde para podermos testar os objetos, precisamos primeiro de uma interface que modele o comportamento do mesmo.

CarroProduct.php:

<?php

namespace FactoryMethod\Product;

// 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;
}


Dentro deste arquivo, para diminuir o número de arquivos, eu criei 2 class diferentes que implementam nossa interface: TeslaModel e Fusca. Este dois são nossos objetos 'concretos' que implementam o modelo(인터페이스).

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

    public function frear(): void
    {
        echo "Tesla freando\n";
    }

    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 acelerando\n";
    }

    public function frear(): void
    {
        echo "Fusca freando\n";
    }

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



우리는 인터페이스 외부의 크리에이터를 제어할 수 있는 문제가 없는 객체를 제어하기 위해 인터페이스 응답을 정의하는 패브릭을 결정합니다.

CarroFactory.php:

<?php

use FactoryMethod\Product\CarroProduct;

// A carro factory, permite que a gente crie qualquer objeto concreto que implemente a interface CarroProduct
interface CarroFactory 
{
    public function criarCarro(string $modeloDoCarro) : CarroProduct;
}


CarroProduct 클래스에서 사용하는 비용은 공장(공장)에서 CarroProduct를 사용할 때 응답할 수 있는 유형이며 인터페이스를 구현하는 품질 클래스입니다.

광장, criaremos 2 클래스 FuscaFactory e TeslaFactory, que serão as class responsáveis ​​por criar nosso Fusca e nosso Tesla.

<?php

use FactoryMethod\Product\CarroProduct;
use FactoryMethod\Product\Fusca;

class FuscaFactory implements CarroFactory 
{
    public function criarCarro(string $modeloDoCarro): CarroProduct
    {
        if ($modeloDoCarro == "fusca")
        {
            return new Fusca();
        } else {
            throw new Exception("Modelo de carro invalido!");
        }
    }
}


마지막으로 nosso 인덱스:


<?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();



Resumidamente, o método fábrica é muito util quando precisamos criar vários objetos que terão comportamentos similares. Claro que aqui foi um exemplo não tão prático, mas por exemplo, se fosse uma montadora de automóveis real, Imagine quantos modelos de carro existem.

좋은 웹페이지 즐겨찾기