:::: MENU ::::

PHP Design patterns: Factory Method

Opa galera, tudo lindo?
Imagino que sim.

Bom eu gosto muito de design patterns(padrões de design de código neste caso), e um que eu gosto bastante por ser realmente prático, é o Factory Method , Eta pattern simples de usar, ta loco, é quase mais prático do que alugar as bicicletas do itau na rua.

Pois bem, o pattern Factory em si, do ingles Fábrica funciona como uma fábrica de objetos. Por exemplo uma ProductFactory cria um objeto Product pra nós.

A Factory normal precisa ser instanciada e ai se usa um método para ai então construir o objeto necessário, já no Factory Method nós mudamos isso e usamos diretamente uma chamada de método estático.

Vamos por a mão na massa então.

Digamos que tenho um sistema que precisa criar vários produtos, computadores, notebooks e etc.

Então vou ter minha fabrica de produtos ou seja a ProductFactory, ela vai ter um metodo estático que vai receber por padrão o nome do tipo de produto que eu quero criar.

Seguindo eu vou concatenar ele com o nome padrão para a minhas classes de produtos especificos e criar assim o nome correto para a classe do produto especifico.

Logo adiante eu testo se a classe realmente existe(isso é importante), se não existir eu lanço uma excessão.

namespace FactoryMethod\Factory;

class ProductFactory
{
    public static function create($kind)
    {
        $kindClass = "FactoryMethod\Handler\Product{$kind}";

        if(!class_exists($kindClass)) {
            throw new \Exception("Class Product{$kind} not found");
        }

        return new $kindClass;
    }

}

Bom com nosso Factory Method pronto agora é barbada né? vamos ter la duas classes como essas

namespace FactoryMethod\Handler;

class ProductComputer
{
    private $name;

    private $information;

    public function __construct()
    {
        $this->name = 'Computer k6';
        $this->information = '8gb memory';
    }
namespace FactoryMethod\Handler;


class ProductNotebook
{
    private $name;

    private $information;

    public function __construct()
    {
        $this->name = 'Notebook Vaio';
        $this->information = '4gb memory';
    }

Elas são dois tipos de produtos e a nossa Factory basicamente vai concatenar o Product com o kind que for passado por parametro como abaixo.

use FactoryMethod\Factory\ProductFactory;

$computer = ProductFactory::create('Computer');
$notebook = ProductFactory::create('Notebook');

echo "Computer Name: " . $computer->getName();

echo "NoteBook Name: " . $notebook->getName();

Pronto, temos duas instancias de objetos diferentes, e o melhor usando apenas umas chamada. O nosso factory method faz o trabalho dele muito bem, e ainda nos poupa um monte de chamadas de classes e possivelmente um switch case pra testar as classes.

Valeu galera, espero ter ajudado.
Um grande abraço.